Ruby的方法解绑机制有什么意义?

ndn*_*kov 8 ruby methods metaprogramming

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
Run Code Online (Sandbox Code Playgroud)

最初,我认为这非常棒,因为我预计它的工作方式与JavaScript的Function.prototype.call()/ 相似Function.prototype.apply().但是,要绑定方法的对象必须属于同一个类.

我能想到的唯一应用是,如果解除绑定方法,丢失原始实现(重新定义原始或单例类中的方法),然后重新绑定并调用它.

kar*_*dog 1

Method 和 UnboundMethod 类型要求绑定目标必须是引用该方法的原始类的子类。然而,该方法已经#to_proc实现了一个方法,这样您就可以摆脱“相同类类型”的约束。

您必须使用#send方法,因为#define_method它是私有的(您不能直接调用它)。

class A
  def hoge ; "hoge" ; end
end

class B ; end

hoge = A.new.method(:hoge)

B.send(:define_method, :hoge_in_b, &hoge) #converting to proc

b = B.new
puts b.hoge_in_b
Run Code Online (Sandbox Code Playgroud)