Project

General

Profile

Actions

Feature #18969

closed

Compare only method definitions for Method#== and UnboundMethod#==

Added by Eregon (Benoit Daloze) over 1 year ago. Updated over 1 year ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:109590]

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.


Related issues 2 (0 open2 closed)

Related to Ruby master - Bug #18751: Regression on master for Method#== when comparing public with private methodClosedEregon (Benoit Daloze)Actions
Is duplicate of Ruby master - Feature #18798: `UnboundMethod#==` with inherited classesClosedActions
Actions #1

Updated by Eregon (Benoit Daloze) over 1 year ago

  • Related to Bug #18751: Regression on master for Method#== when comparing public with private method added
Actions #3

Updated by Eregon (Benoit Daloze) over 1 year ago

  • Is duplicate of Feature #18798: `UnboundMethod#==` with inherited classes added

Updated by Eregon (Benoit Daloze) over 1 year ago

  • Status changed from Open to Closed

@ko1 (Koichi Sasada) Indeed, I'll mark this one as duplicate and close it, and I'll add your issue to the dev meeting.

Updated by Eregon (Benoit Daloze) over 1 year ago

#18798 made me realize the proposed behavior makes sense for UnboundMethod#== but probably less for Method#== which probably should keep checking the receivers are the same.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0