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

StackOverflow https://stackoverflow.com/questions/4083794

  •  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?

¿Fue útil?

Solución

Hay dos problemas con su código:

  1. MyClassA.new no devuelve el valor de initialize siempre devuelve una instancia de MyClassA.

  2. No se puede llamar a la proc, usted tiene que utilizar el método instance_eval para ejecutarlo en el contexto de MyClassB

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"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top