1

我正在尝试构建一个在不同上下文中使用不同版本的类的 api。为什么下面的代码返回一个未初始化的常量 Project 错误,而不是在模块中查找正确的常量?

module A
  module B
    class Project
    end
  end
end

A::B.module_eval do
  puts Project
end

结尾

4

1 回答 1

3

当您在 中使用块时module_eval它不会改变在块中查找常量的方式。它只会更改对方法、实例和类变量的查找。这是由于块是封闭的必要效果,并保留了一些它自己的周围环境。

这可以通过使用字符串版本module_eval或通过 const_get 手动查找常量来解决:

module A
  module B
    class Project
    end
  end
end

A::B.module_eval{ const_get(:Project) }
  #=> A::B::Project
于 2013-01-09T07:22:55.160 回答