Ruby 如何在包含的模块中使用define_方法来创建方法?
我想要一个类方法,Ruby 如何在包含的模块中使用define_方法来创建方法?,ruby,metaprogramming,Ruby,Metaprogramming,我想要一个类方法,step,它动态地创建实例方法 step(:start) do |payload| puts payload end 这将产生相当于: def start(payload) payload end 我遇到的麻烦是在实例的上下文中将一个块传递给类方法evaluate 问题似乎在于,由于该块是闭包,因此它是在定义了is的上下文中进行计算的,即类 module Steps def step(name, &block) define_method(nam
step
,它动态地创建实例方法
step(:start) do |payload|
puts payload
end
这将产生相当于:
def start(payload)
payload
end
我遇到的麻烦是在实例的上下文中将一个块传递给类方法evaluate
问题似乎在于,由于该块是闭包,因此它是在定义了is的上下文中进行计算的,即类
module Steps
def step(name, &block)
define_method(name) do |payload|
self # => Foo instance
block.call(payload)
end
end
end
class Foo
extend Steps
step(:start) do |payload|
self # => Foo class
payload # => 1
self.data # => undefined method `data' for Foo:Class (NoMethodError)
end
def data
'DATA'
end
end
puts Foo.new.start(1)
是否可以在实例的上下文中计算块
我最近使用的是instance\u eval
,但是我不知道如何将参数payload
传递到块:
define_method(name) do |payload|
instance_eval(&block)
end
当我在传递的块中执行上述self
时,是Foo
的一个实例,因此我可以调用数据
,但是如何访问有效负载
实例执行
在接收器(obj)的上下文中执行给定的块。在里面
为了设置上下文,变量self设置为obj,而
代码正在执行,允许代码访问obj的实例变量。
参数作为块参数传递
参考:
define_method(name) do |payload|
instance_exec(payload, &block)
end