我正在尝试定义一个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
答案 0 :(得分:1)
Ruby常量查找规则不会随class_eval
或module_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