我正在尝试定义一个 DSL,其中一些常量是在一个 block 中定义的,并且必须被复制到一个新制作的模块中。到目前为止我得到了这个:
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
,但是常量丢失了。
如何获取 block 中定义的常量?
我想通过类中嵌入的新模块访问它们,比如 Foo::Macros::Point
最佳答案
Ruby 常量查找规则不随 class_eval
或 module_eval
改变,所以你不能在 Foo
的 block 中定义常量遗憾的是,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
关于ruby - 将 block 常量复制到模块中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28156006/