1
我想構建一個API,在不同的上下文中使用不同版本的類。爲什麼下面的代碼返回一個未初始化的常量項目錯誤,而不是在模塊中查找正確的常量?module_eval和命名空間範圍
module A
module B
class Project
end
end
end
A::B.module_eval do
puts Project
end
末
我想構建一個API,在不同的上下文中使用不同版本的類。爲什麼下面的代碼返回一個未初始化的常量項目錯誤,而不是在模塊中查找正確的常量?module_eval和命名空間範圍
module A
module B
class Project
end
end
end
A::B.module_eval do
puts Project
end
末
當您在module_eval
使用塊,it doesn't change the way constants are looked up in the block。它只改變查找方法,實例和類變量。這是由於封閉塊的必要作用,並保留了它自身的一些周圍環境。
這可以通過左右或者使用的module_eval
字符串版本或通過手動const_get查找該常數工作:
module A
module B
class Project
end
end
end
A::B.module_eval{ const_get(:Project) }
#=> A::B::Project
謝謝你的解釋,我想知道如果這也與封閉有關,非常有用+1。 – iain
這似乎是奇怪。特別是'A :: B.module_eval「Project」'是好的 –
它只發生在塊形式,字符串參數形式工作正常'A :: B.module_eval「把項目」' – iain