Ruby Proc: Aufrufen von Verfahren aus der Klasse A aus der Klasse B und der Klasse B mit Hilfe der ‚Methode‘

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

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

War es hilfreich?

Lösung

Es gibt zwei Probleme mit Ihrem Code:

  1. MyClassA.new nicht den Wert von initialize zurückgeben gibt immer eine Instanz von MyClassA.

  2. Sie können nicht nur die proc aufrufen, müssen Sie die instance_eval Methode verwenden es im Zusammenhang mit MyClassB

  3. 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"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top