Feature #17674
closedProposal: `Method#source_location` or `Method#owner` for refined methods
Description
Inspired by https://bugs.ruby-lang.org/issues/15504#note-17
I'm working on a gem with Ruby refinements, and some methods are invented in new Ruby versions like 2.5 or 3.0, and I'd like to define in this gem should I refine a method or not.
So… current behavior of Method#source_location
returns nil
for core and/or refined methods. I think, refinements should be caught by this method. Also I didn't know about Method#owner
, but it can be a case for refinements too.
Updated by osyo (manga osyo) almost 4 years ago
hi.
In Ruby 2.7 and later, #method
supports Refinements.
# test.rb
module Cover
refine Range do
def cover?(value)
return super unless value.is_a?(Range)
super(value.first) && super(value.last)
end
end
end
using Cover
pp (1..10).method(:cover?).source_location
# Ruby 2.6 => nil
# Ruby 2.7 => ["/test.rb", 4]
pp (1..10).method(:cover?).owner
# Ruby 2.6 => Range
# Ruby 2.7 => #<refinement:Range@Cover>
Updated by AlexWayfer (Alexander Popov) almost 4 years ago
osyo (manga osyo) wrote in #note-1:
hi.
In Ruby 2.7 and later,#method
supports Refinements.# test.rb module Cover refine Range do def cover?(value) return super unless value.is_a?(Range) super(value.first) && super(value.last) end end end using Cover pp (1..10).method(:cover?).source_location # Ruby 2.6 => nil # Ruby 2.7 => ["/test.rb", 4] pp (1..10).method(:cover?).owner # Ruby 2.6 => Range # Ruby 2.7 => #<refinement:Range@Cover>
Can't confirm:
# frozen_string_literal: true
puts RUBY_VERSION
p (1..10).method(:cover?).source_location
~/Projects/ruby/test/source_location
> ruby test.rb
3.0.0
nil
~/Projects/ruby/test/source_location
> rbenv local 2.7.2
~/Projects/ruby/test/source_location
> ruby test.rb
2.7.2
nil
I'd like to attach a link to something like repl.it, but there is only Ruby 2.5.
Updated by xtkoba (Tee KOBAYASHI) almost 4 years ago
The example code in #note-2 does not seem to refine Range#cover?
. This method is defined natively in range.c
, and so the behavior is expected (Method#source_location
should return nil
).
Updated by AlexWayfer (Alexander Popov) almost 4 years ago
xtkoba (Tee KOBAYASHI) wrote in #note-3:
The example code in #note-2 does not seem to refine
Range#cover?
. This method is defined natively inrange.c
, and so the behavior is expected (Method#source_location
should returnnil
).
Sorry, you're correct, I didn't understand the code from #note-1 correctly.
(I don't see an ability to close this issue by myself)
Updated by jeremyevans0 (Jeremy Evans) almost 4 years ago
- Status changed from Open to Closed