Rubino Proc: metodo Invocare dalla classe A alla classe B da, e l'utilizzo di 'metodo' di classe B
-
28-09-2019 - |
Domanda
Non sono sicuro se questo è effettivamente possibile, ma non è stato in grado di trovare una chiara risposta da nessuna parte. Inoltre mi è difficile definire la mia domanda a mera 'termini di ricerca'. Quindi mi dispiace se questo è già stato risposto da qualche altra parte, io non riuscivo a trovarlo.
Quello che vorrei sapere è se è possibile creare un Proc che contiene un metodo che non è definito nella posizione in cui si sta definendo il Proc. Poi vorrei mettere tale istanza all'interno di un'altra classe che ha il metodo, ed eseguire quello con gli argomenti forniti.
Ecco un esempio di quello che voglio realizzare, ma non so come.
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)
viene prodotto il seguente errore
NoMethodError: undefined method for #<MyClassA:0x10017d878>
E credo di capire perché, è perché si sta cercando di richiamare il metodo run
nell'istanza MyClassA
piuttosto che quello in MyClassB
. Tuttavia, c'è un modo ho potuto fare il comando run
invoke metodo di istanza MyClassB
di run
?
Soluzione
Ci sono due problemi con il codice:
-
MyClassA.new
non restituisce il valore diinitialize
ritorna sempre un'istanza diMyClassA
. -
Non si può semplicemente chiamare il proc, è necessario utilizzare il metodo
instance_eval
per l'esecuzione nel contesto diMyClassB
Ecco il codice corretto per il lavoro che si desidera:
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"