[ruby-core:109600] [Ruby master Feature#18969] Compare only method definitions for Method#== and UnboundMethod#==
From:
"ko1 (Koichi Sasada)" <noreply@...>
Date:
2022-08-20 16:21:54 UTC
List:
ruby-core #109600
Issue #18969 has been updated by ko1 (Koichi Sasada).
Same as https://bugs.ruby-lang.org/issues/18798 ?
----------------------------------------
Feature #18969: Compare only method definitions for Method#== and UnboundMethod#==
https://bugs.ruby-lang.org/issues/18969#change-98781
* Author: Eregon (Benoit Daloze)
* Status: Open
* Priority: Normal
----------------------------------------
From https://bugs.ruby-lang.org/issues/18751#note-16
During the last dev meeting, @ko1 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:
```ruby
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.
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>