gpt4 book ai didi

ruby - 将 block 常量复制到模块中

转载 作者:太空宇宙 更新时间:2023-11-03 16:24:08 25 4
gpt4 key购买 nike

我正在尝试定义一个 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_evalmodule_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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com