Was ist der Zweck von Bind / Unbind-Methoden in Ruby?

Was ist der Zweck vonMethod#unbind undUnboundMethod#bind?

Soweit ich erfahre, sind Methoden aufrufbare Objekte wie procs und lambdas, mit der Ausnahme, dass Methoden an den Gültigkeitsbereich ihres Empfängers gebunden sind:

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

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

Ich kann anrufena_method wenn ich im Kontext von @ bSomeClass oder wenn ich ein Objekt von @ haSomeClass. Ich kann es zu einem aufrufbaren Objekt machen, indem ich die Methode als @ extrahierMethod object, aber es ist immer noch an ein Objekt der Klasse @ gebundSomeClass in diesem Beispiel:

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

Warum sollte ich @ wollunbind eine Methode von seinem Empfänger? Vielleicht kann ich das weitergeben oderbind es zu einem anderen Objekt geben es neuen Kontext, vielleicht kann ich ein völlig anderes Objekt diese Methode ohne Vererbung aufrufen, aber ich kann nichts damit tun, es sei denn, ich binde es an ein Objekt seiner ursprünglichen Klasse oder ich konvertiere es in einProc object (wirklich ein Lambda, da Methoden und Lambdas etwas ähnlich sind):

# 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"

Ich könnte das Methodenobjekt in einen Proc konvertieren und vielleicht etwas damit anfangen:

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"

Was ist der Zweck dafür? Was sind die realen Anwendungen für so etwas?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage