Feature #18969
closedCompare only method definitions for Method#== and UnboundMethod#==
Description
From https://bugs.ruby-lang.org/issues/18751#note-16
During the last dev meeting, @ko1 (Koichi Sasada) said Method#== should be "is it the same definition?" and I agree.
In #18751 I did it for zsuper methods (was necessary for compatibility).
But maybe we should do it for all methods.
Currently, Method#== and UnboundMethod#== compare the method definitions, but also (I think, the code is not that clear) on which receiver/class the method was fetched (klass for klass.instance_method(name)
or obj
for obj.method(name)
).
(Maybe it checks the #owner
too? I'm unsure)
This proposal is to do only the first: compare the method definitions.
So for instance:
class A
def foo
end
end
class B < A
end
p A.instance_method(:foo) # => #<UnboundMethod: A#foo() method_eq.rb:2>
p A.instance_method(:foo).owner
p B.instance_method(:foo) # => #<UnboundMethod: B(A)#foo() method_eq.rb:2>
p B.instance_method(:foo).owner
p A.instance_method(:foo) == B.instance_method(:foo) # currently false, with proposal true
p A.new.method(:foo) == B.new.method(:foo) # currently false, with proposal true
# Current workaround needed to compare definitions:
m1, m2 = A.instance_method(:foo), B.instance_method(:foo)
p m1.owner.instance_method(m1.name) == m2.owner.instance_method(m2.name) # => true
m1, m2 = A.new.method(:foo), B.new.method(:foo)
p m1.owner.instance_method(m1.name) == m2.owner.instance_method(m2.name) # => true
I think this is the main usage of Method#== and UnboundMethod#==, to compare "is it the same method definition?".
OTOH, if we think this is not good for #== we could add {Method,UnboundMethod}#same_definition?(other)
. same_definition?
has the slight advantage that it could be true for Method#same_definition?(UnboundMethod)
and vice versa.