Ruby Proc:クラスAからクラスAからのメソッドを呼び出し、クラスBの「メソッド」を使用して
-
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つの問題があります。
MyClassA.new
の価値を返さないinitialize
常にインスタンスを返しますMyClassA
.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"
所属していません StackOverflow