Ruby Proc: Aufrufen von Verfahren aus der Klasse A aus der Klasse B und der Klasse B mit Hilfe der ‚Methode‘
-
28-09-2019 - |
Frage
Ich bin nicht sicher, ob dies tatsächlich möglich ist, aber ich war nicht in der Lage, eine klare Antwort überall zu finden. Ich finde es auch schwer, meine Frage in nur zu definieren ‚suchen Begriffe‘. Also tut mir leid, wenn dies schon woanders beantwortet wurde, konnte ich es nicht finden.
Was würde Ich mag es, wissen, ob es möglich ist, ein Proc zu schaffen, das eine Methode enthält, die nicht in der Lage definiert wird, wo der Proc definiert wird. Dann würde Ich mag diese Instanz innerhalb einer anderen Klasse setzen, die die Methode funktioniert haben, und führen Sie, dass man mit den mitgelieferten Argumenten.
Hier ist ein Beispiel von dem, was ich erreichen will, aber nicht wissen, wie.
class MyClassA
# This class does not have the #run method
# but I want Class B to run the #run method that
# I invoke from within the Proc within this initializer
def initialize
Proc.new { run 'something great' }
end
end
class MyClassB
def initialize(my_class_a_object)
my_class_a_object.call
end
# This is the #run method I want to invoke
def run(message)
puts message
end
end
# This is what I execute
my_class_a_object = MyClassA.new
MyClassB.new(my_class_a_object)
Der folgende Fehler wird erzeugt
NoMethodError: undefined method for #<MyClassA:0x10017d878>
Und ich glaube, ich verstehe, warum es ist, weil es versucht, die run
Methode auf dem MyClassA
Instanz aufrufen, anstatt die man in MyClassB
. Allerdings ist es eine Möglichkeit, den run
Befehl invoke MyClassB
des run
Instanz-Methode machen könnte?
Lösung
Es gibt zwei Probleme mit Ihrem Code:
-
MyClassA.new
nicht den Wert voninitialize
zurückgeben gibt immer eine Instanz vonMyClassA
. -
Sie können nicht nur die proc aufrufen, müssen Sie die
instance_eval
Methode verwenden es im Zusammenhang mitMyClassB
laufen
Hier ist der Code zur Arbeit korrigiert, wie Sie wollen:
class MyClassA
def self.get_proc
Proc.new { run 'something great' }
end
end
class MyClassB
def initialize(my_class_a_object)
instance_eval(&my_class_a_object)
end
# This is the #run method I want to invoke
def run(message)
puts message
end
end
# This is what I execute
my_class_a_object = MyClassA.get_proc
MyClassB.new(my_class_a_object) #=> "something great"