bk1eのメソッドはほとんどの場合機能しますが、たまたま機能しない場合があります。
class Stream
class << self
alias_method :open, :new
end
end
open = Stream.method(:open)
new = Stream.method(:new)
p open, new # => #<Method: Stream.new>, #<Method: Class#new>
p open.receiver, new.receiver # => Stream, Stream
p open == new # => false
true
出力はRuby1.9で生成されますが、Ruby 1.8が最後の行で生成されるため、バグかどうかはわかりません。したがって、1.9を使用している場合は、継承されたクラスメソッド(Class#newなど)をエイリアスする場合は注意してください。これら2つのメソッドは同じオブジェクト(クラスオブジェクトStream
)にバインドされますが、Ruby1.9では同等ではないと見なされます。
私の回避策は簡単です。元のメソッドに再度エイリアスを作成し、2つのエイリアスの同等性をテストします。
class << Stream; alias_method :alias_test_open, :new; end
open = Stream.method(:open)
alias_test_open = Stream.method(:alias_test_open)
p open, alias_test_open # => #<Method: Stream.new>, #<Method: Stream.new>
p open.receiver, alias_test_open.receiver # => Stream, Stream
p open == alias_test_open # => true
お役に立てれば。
アップデート:
http://bugs.ruby-lang.org/issues/7613を参照してください
したがってMethod#==
、この場合、super
呼び出しはさまざまなメソッドを呼び出すため、falseを返す必要があります。バグではありません。