Rubino Proc: metodo Invocare dalla classe A alla classe B da, e l'utilizzo di 'metodo' di classe B

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

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

È stato utile?

Soluzione

Ci sono due problemi con il codice:

  1. MyClassA.new non restituisce il valore di initialize ritorna sempre un'istanza di MyClassA.

  2. Non si può semplicemente chiamare il proc, è necessario utilizzare il metodo instance_eval per l'esecuzione nel contesto di MyClassB

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"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top