Какова цель методов bind / unbind в Ruby?

Какова цель наличияMethod#unbind а такжеUnboundMethod#bind?

Из того, что я понял, методы - это вызываемые объекты, такие как procs и lambdas, за исключением того, что методы связаны с областью действия их получателя:

class SomeClass
  def a_method; puts "from SomeClass"; end
end

s = SomeClass.new
s.a_method # => "from SomeClass"

я могу позвонитьa_method если я в контекстеSomeClass или если у меня есть объектSomeClass, Я могу сделать это вызываемым объектом, извлекая метод какMethod объект, но он все еще связан с объектом классаSomeClass в этом примере:

m = s.method :a_method
m.class # => Method
m.owner # => SomeClass
m.call # => "from SomeClass"

Почему я хочуunbind метод из его получателя? Может быть, я могу передать это илиbind это к другому объекту, дающему это новый контекст, возможно я могу иметь совершенно другой объект, вызывающий этот метод без наследования, но я ничего не могу сделать с ним, если я не привязываю его к объекту его исходного класса или я преобразовываю его вProc объект (действительно лямбда, так как методы и лямбды несколько похожи):

# Module#instance_method gives me an UnboundMethod
ub = SomeClass.instance_method :a_method
ub.class # -> UnboundMethod

# now I can't make any calls 
ub.call # -> NoMethod Error, undefined method 'call'

class AnotherClass; end
a = AnotherClass.new
b = ub.bind(a) # -> TypeError: bind argument must be an instance of SomeClass
b = ub.bind(SomeClass.new).call # -> "from SomeClass"

Я мог бы преобразовать объект метода в процесс и, возможно, сделать что-то с ним:

AnotherClass.class_eval do
  # I can access m becausec this block is evaluated in the same 
  # scope it's defined, so I can grab m ;)
  define_method(:method_from_some_class, m.to_proc)
end

AnotherClass.instance_methods(false) # -> [:method_from_some_class]
a.method_from_some_class # -> "from SomeClass"

Какова цель сделать это? Каковы реальные приложения для чего-то вроде этого?

Ответы на вопрос(1)

Ваш ответ на вопрос