Actions
Bug #11274
closedEquality inconsistency between Method and UnboundMethod
Description
Method と UnboundMethod の equality が一貫していません。
module M1
def foo; end
end
module M2
include M1
alias bar foo
end
class C
include M1
include M2
end
c = C.new
c_m1 = c.method(:foo)
c_m2 = c.method(:bar)
p [c_m1, c_m2, c_m1 == c_m2, c_m2 == c_m1]
結果
[#<Method: C(M1)#foo>, #<Method: C(M1)#bar(foo)>, true, true]
こんな感じで、同じと判断されます。
しかし、UnboundMethod#== を見てみると、
module M1
def foo; end
end
module M2
include M1
alias bar foo
end
ubm1 = M1.instance_method(:foo)
ubm2 = M2.instance_method(:bar)
p [ubm1, ubm2, ubm1==ubm2, ubm2==ubm1]
結果
[#<UnboundMethod: M1#foo>, #<UnboundMethod: M2(M1)#bar(foo)>, false, false]
等しくない、と言われます。
ここで、異なる必要は無いと思うので、どちらかに合わせるといいと思うのですが、どうでしょうか。
ちなみに、Method#== の説明では、
* Two method objects are equal if they are bound to the same
* object and refer to the same method definition and their owners are the
* same class or module.
とあり「オーナーが一緒なら」とありますが、
module M1
def foo; end
end
module M2
include M1
alias bar foo
end
class C
include M1
include M2
end
c = C.new
c_m1 = c.method(:foo)
c_m2 = c.method(:bar)
p c_m1.owner, c_m2.owner
結果
M1
M2
と、オーナーが異なります。なので、Method#== の挙動か、ドキュメントが間違いなんじゃないかと思います。
多分、あまり影響が無いので、誰も気にしていないのじゃ無いかとは思うんですが、誰か一家言ある人は居ますかね。
とりあえず、松本さんに振っておきますが、とくにご意見がないようでしたら、実装が簡単な方(owner が異なれば否定)としようと思います。
alias されたメソッド同士は同値であるか、という問題です。
Actions
Like0
Like0Like0