0

これが実際に可能かどうかはわかりませんが、明確な答えはどこにも見つかりませんでした。また、私の質問を単なる「検索用語」で定義するのは難しいと思います。これがすでにどこかで回答されている場合は申し訳ありませんが、私はそれを見つけることができませんでした.

私が知りたいのは、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メソッドを呼び出そうとしているためです。ただし、コマンドでインスタンスメソッドを呼び出す方法はありますか?MyClassAMyClassBrunMyClassBrun

4

1 に答える 1

2

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

  1. MyClassA.newitの値を返しません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"
于 2010-11-03T21:43:51.157 に答える