ruby-reference-manual:3169
From: "pypypy567 (py _)" <redmine@r...>
Date: Wed, 15 Aug 2012 18:31:32 +0900
Subject: [ruby-reference-manual:3169] [るりまプロジェクト - Bug #6874][Open] 1.9系での Method と UnboundMethod の #eql? と #hash
Issue #6874 has been reported by pypypy567 (py _). ---------------------------------------- Bug #6874: 1.9系での Method と UnboundMethod の #eql? と #hash https://bugs.ruby-lang.org/issues/6874 Author: pypypy567 (py _) Status: Open 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