Ruby Proc:クラスAからクラスAからのメソッドを呼び出し、クラスBの「メソッド」を使用して

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

  •  28-09-2019
  •  | 
  •  

質問

これが実際に可能かどうかはわかりませんが、どこでも明確な答えを見つけることができませんでした。また、単なる「検索用語」で自分の質問を定義するのは難しいと感じています。だから、これがすでにどこかで答えられているなら、私はそれを見つけることができませんでした。

私が知りたいのは、PROCが定義されている場所で定義されていないメソッドを保持するPROCを作成できるかどうかです。次に、そのインスタンスを別のクラスの内部に配置し、提供された議論でそれを実行したいと思います。

これが私が達成したいことのサンプルですが、方法がわかりません。

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)

次のエラーが生成されます

NoMethodError: undefined method  for #<MyClassA:0x10017d878>

そして、私は理由を理解していると思います、それはそれが呼びかけようとしているからです run の方法 MyClassA インスタンスではなくインスタンス MyClassB. 。しかし、私が作る方法はありますか run コマンドが呼び出されます MyClassB's run インスタンスメソッド?

役に立ちましたか?

解決

コードには2つの問題があります。

  1. MyClassA.new の価値を返さない initialize 常にインスタンスを返します MyClassA.

  2. Procを呼び出すだけではありません。 instance_eval コンテキストで実行する方法 MyClassB

これがあなたのコードがあなたが望むように動作するように修正されたものです:

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"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top