[前][次][番号順一覧][スレッド一覧]

ruby-reference-manual:3171

From: "sho-h (Sho Hashimoto)" <sho-h@n...>
Date: Thu, 16 Aug 2012 00:59:36 +0900
Subject: [ruby-reference-manual:3171] [るりまプロジェクト - Bug #6874][Closed] 1.9系での Method と UnboundMethod の #eql? と #hash


Issue #6874 has been updated by sho-h (Sho Hashimoto).

Status changed from Open to Closed
% Done changed from 0 to 100

ありがとうございます。

Method#eql? を以下のように修正しました。(UnboundMethod#eql? も同様です)

* 1.8 系では、Object#eql? のままなので削除(Method#== は定義されているため残した)
* 1.9 系では、Method#eql? と Method#== は同じ method_eq(proc.c) のため同一のエントリとした(Method#=== は定義していないため削除)

#hash も 1.8 系では削除し、1.9 系では単純に「自身のハッシュ値を返します」としました。
----------------------------------------
Bug #6874: 1.9系での Method と UnboundMethod の #eql? と #hash
https://bugs.ruby-lang.org/issues/6874#change-28897

Author: pypypy567 (py _)
Status: Closed
Priority: Normal
Assignee: 
Category: 
Target version: 
reporter: 
ruby_version: 


1.9系での Method と UnboundMethod の #eql? と #hash

http://doc.okkez.net/static/193/method/Method/i/eql=3f.html
> 指定された other が self 自身である場合のみ真を返します。これは Object クラスで定義されたデフォルトの動作です。
1.9系では同じオブジェクトから生成された同じメソッドなら真を返すように再定義されているようです。
#hash も再定義され、 object_id とは一致しなくなっています。

#-- testa.rb
def foo; end
a = method(:foo)
b = method(:foo)
p [a.object_id == a.hash, a.eql?(b)]

> ruby -v testa.rb
ruby 1.8.7 (2012-06-29 patchlevel 370) [i386-mingw32]
[true, false]
ruby 1.9.1p430 (2010-08-16 revision 28998) [i386-mingw32]
[false, true]

ちなみに alias してもちゃんと同じメソッドとみなされます。
逆に名前が同じなだけの別メソッドは駄目です。
> ruby -e "def f; end; alias g f; p method(:f).eql?(method(:g))"
true
> ruby -e "def f; end; a = method(:f); def f; end; p a.eql?(method(:f))"
false


http://doc.okkez.net/static/193/method/UnboundMethod/i/eql=3f.html
同様に UnboundMethod#hash も再定義されています。
こちらは生成元のインスタンスが異なっても同じメソッドなら true を返します。

#-- testb.rb
def foo; end
m = method(:foo)
a = m.unbind
b = m.unbind  # 同じ Method オブジェクトから作った UnboundMethod オブジェクト
c = Object.new.method(:foo).unbind  # a とは receiver も違う
p [a.eql?(b), a.eql?(c)]

> ruby -v testb.rb
ruby 1.8.7 (2012-06-29 patchlevel 370) [i386-mingw32]
[false, false]
ruby 1.9.1p430 (2010-08-16 revision 28998) [i386-mingw32]
[true, true]



-- 
http://bugs.ruby-lang.org/

--
ML: ruby-reference-manual@m...
Info: http://QuickML.com/

[前][次][番号順一覧][スレッド一覧]

      3169 2012-08-15 11:31 [redmine@r...        ] [るりまプロジェクト - Bug #6874][Open] 1.9系での Method と UnboundMethod の #eql? と #hash
->    3171 2012-08-15 17:59 ┗[sho-h@n...          ] [るりまプロジェクト - Bug #6874][Closed] 1.9系での Method と UnboundMethod の #eql? と #hash