我正在尝试构建一个在不同上下文中使用不同版本的类的 api。为什么下面的代码返回一个未初始化的常量 Project 错误,而不是在模块中查找正确的常量?
module A
module B
class Project
end
end
end
A::B.module_eval do
puts Project
end
结尾
我正在尝试构建一个在不同上下文中使用不同版本的类的 api。为什么下面的代码返回一个未初始化的常量 Project 错误,而不是在模块中查找正确的常量?
module A
module B
class Project
end
end
end
A::B.module_eval do
puts Project
end
结尾
当您在 中使用块时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