将块常量复制到模块中

时间:2015-01-26 18:04:59

标签: ruby module dsl

我正在尝试定义一个DSL,其中一些常量在一个块中定义,并且必须复制到一个新制作的模块中。到目前为止我得到了这个:

class Foo
  def self.macros(&block)
    mod = Module.new do
      module_eval &block
    end
    self.const_set(:Macros, mod)
  end

  macros do
    Point = Struct.new :x, :y
    VALUE = 5

    def self.bar 
      "bar"
    end

    def foo
      "foo"
    end
  end
end

使用上面的代码我设法获得Foo::Macros.bar但是常量缺失。

如何获取块中定义的常量?

我想通过嵌入在课堂内的新模块来访问它们,例如Foo::Macros::Point

1 个答案:

答案 0 :(得分:1)

Ruby常量查找规则不会随class_evalmodule_eval而变化,因此您无法在Foo中的块中定义常量Foo::Macros可悲的是。


简单地:

Foo::Value
Foo::Point

Foo::Macros只是您定义的匿名模块的别名,它不会更改定义的对象的范围。

如果您先定义模块,可以使用const_get

访问它
module Test
end
Test.module_eval do
  ANSWER = 42
end
Test.const_get('ANSWER')
=> 42