Rubí Proc: La invocación de método de la clase A desde el interior de la clase B, y el uso de 'método' de Clase B
-
28-09-2019 - |
Pregunta
No estoy seguro de si esto es realmente posible, pero no fue capaz de encontrar en cualquier lugar de una respuesta clara. También me resulta difícil de definir mi pregunta en la mera 'términos de búsqueda'. Así que lo siento si esto ya ha sido contestada en otro lugar, no pude encontrarlo.
Lo que me gustaría saber es si es posible crear una Proc que contiene un método que no está definido en el lugar donde se está definiendo el Proc. Entonces me gustaría poner esa instancia dentro de otra clase que tiene el método y ejecución que uno con los argumentos proporcionados.
Este es un ejemplo de lo que quiero lograr, pero no saben cómo.
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)
se produce el siguiente error
NoMethodError: undefined method for #<MyClassA:0x10017d878>
Y creo que entiendo por qué, es porque está tratando de invocar el método run
en la instancia MyClassA
en lugar de la de MyClassB
. Sin embargo, hay una manera que podría hacer el comando run
invocación de método de instancia MyClassB
de run
?
Solución
Hay dos problemas con su código:
-
MyClassA.new
no devuelve el valor deinitialize
siempre devuelve una instancia deMyClassA
. -
No se puede llamar a la proc, usted tiene que utilizar el método
instance_eval
para ejecutarlo en el contexto deMyClassB
Aquí está el código corregido para el trabajo que desee:
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"