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
输出是在 Ruby 1.9 中生成的,不确定是否是错误,因为 Ruby 1.8true
为最后一行生成。因此,如果您使用的是 1.9,请小心为继承的类方法(如 Class#new)设置别名,这两个方法绑定到同一个对象(类对象Stream
),但 Ruby 1.9 认为它们不等效。
我的解决方法很简单 - 再次为原始方法设置别名并测试两个别名的相等性:
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#==
在这种情况下应该返回 false,因为super
调用会调用不同的方法;这不是一个错误。