Method#unbind
возвращает UnboundMethod
ссылку на метод, который впоследствии может быть привязан к другому объекту с использованием UnboundMethod#bind
.В чем смысл механизма развязывания метода Руби?
class Foo
attr_reader :baz
def initialize(baz)
@baz = baz
end
end
class Bar
def initialize(baz)
@baz = baz
end
end
f = Foo.new(:test1)
g = Foo.new(:test2)
h = Bar.new(:test3)
f.method(:baz).unbind.bind(g).call # => :test2
f.method(:baz).unbind.bind(h).call # => TypeError: bind argument must be an instance of Foo
Первоначально я думал, что это невероятно удивительным, потому что я ожидал, что он будет работать так же, как в JavaScript Function.prototype.call()
/Function.prototype.apply()
. Однако объект, к которому вы хотите привязать метод , должен быть одного класса.
Единственное приложение, о котором я могу думать, - это отменить метод, потерять исходную реализацию (переопределить метод в исходном или одноэлементном классе), а затем повторить и вызвать его.
Я нашел изящное объяснение здесь - http://blog.jayfields.com/2006/12/ruby-alias-method-alternative.html –
@WandMaker, отличная идея. Он относится к категории, которую я описал. Я был бы удивлен, если это единственная причина его существования. – ndn