生成辅助功能模块

时间:2009-12-30 14:07:01

标签: ruby metaprogramming dsl

我正在编写DSL来生成生物信息学平面文件的解析器。我想让用户在块中定义辅助函数,然后在解析上下文对象中包含该函数。我想使用如下语法:

rules = Rules.new do
  helpers do
     def foo()
       #...
     end
     def bar( baz )
       #...
     end
   end
   # Here come the parsing rules which can access both helper methods
 end

我想将辅助方法添加到模块定义中,并在实例中包含模块(只是实例而不是类)。

您是否知道如何实现这一目标?语法略有不同的答案也很受欢迎。

1 个答案:

答案 0 :(得分:1)

也许是这样的事情?

class Rules
  def initialize(&block)
    instance_eval &block
  end

  def helpers
    yield
  end
end

Rules.new do
  helpers do
    def hi_world
      puts "Hello World!"
    end
  end

  hi_world
end

请注意,虽然helpers方法没有什么特别之处,但它只依赖于Rules块已经是当前范围的事实。