From: "Eregon (Benoit Daloze)" Date: 2022-08-20T12:05:52+00:00 Subject: [ruby-core:109590] [Ruby master Feature#18969] Compare only method definitions for Method#== and UnboundMethod#== Issue #18969 has been reported by Eregon (Benoit Daloze). ---------------------------------------- Feature #18969: Compare only method definitions for Method#== and UnboundMethod#== https://bugs.ruby-lang.org/issues/18969 * 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) # => # p A.instance_method(:foo).owner p B.instance_method(:foo) # => # 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: