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

标签 ruby module dsl

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

相关文章:

node.js - NodeJS readdir 并需要相对路径

c++ - 如何在每个新模块中自动注入(inject)辅助类?

ruby - 这种内部 DSL 语法在 Ruby 中是否可行?

reference - Xtext:对属性的 DSL 引用

ruby - Mongoid:根据嵌入文档数组的大小进行查询

Ruby 不能访问方法外的变量?

ruby - "require"默认查找的路径是什么?

ruby - 使用 Ruby 命令行的类似 Awk 的 BEGIN 和 END

node.js - 从同一文件 node.js 访问另一个 module.exports 函数

java - Camel java dsl将bean方法返回值传递给 header