2013-01-08 56 views
1

我想構建一個API,在不同的上下文中使用不同版本的類。爲什麼下面的代碼返回一個未初始化的常量項目錯誤,而不是在模塊中查找正確的常量?module_eval和命名空間範圍

module A 
    module B 
    class Project 
    end 
    end 
end 

A::B.module_eval do 
    puts Project 
end 

+0

這似乎是奇怪。特別是'A :: B.module_eval「Project」'是好的 –

+0

它只發生在塊形式,字符串參數形式工作正常'A :: B.module_eval「把項目」' – iain

回答

3

當您在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 
+0

謝謝你的解釋,我想知道如果這也與封閉有關,非常有用+1。 – iain