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