我不确定这是否真的可行,但我无法在任何地方找到明确答案。此外,我发现很难用“搜索术语”来定义我的问题。所以我很抱歉,如果已经在其他地方回答过,我找不到它。
我想知道的是,是否可以创建一个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
的{{1}}实例方法?
答案 0 :(得分: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"