2013-10-21 163 views
0

我在嵌套模塊中訪問模塊常量時遇到問題。下面的代碼:在嵌套模塊中訪問常量

outer.rb

require 'inner.rb' 

module Outer 
    BASE_DIR = "cache/" 
end 

inner.rb

module Outer 
    module Inner 
    puts BASE_DIR 
    end 
end 

如果我在inner.rb運行代碼我得到以下錯誤:

<module:Inner>': uninitialized constant Outer::Inner::BASE_DIR (NameError) 

我以爲,既然在外部模塊中聲明的BASE_DIR也應該可以在內部模塊中訪問,但似乎並非如此。

+0

您帖子頂部的錯誤消息是什麼?我自由地刪除它。 –

+0

錯誤的複製/粘貼。感謝編輯。 – Chris911

回答

2

這是加載順序的問題。更換與實際需要的代碼需要揭示你的代碼是按以下順序加載:

module Outer 
    module Inner 
    puts BASE_DIR 
    end 
end 

module Outer 
    BASE_DIR = "cache/" 
end 

現在是很容易明白爲什麼不能工作。如錯誤消息所示,常量在您嘗試訪問時並未定義。發生這種情況是因爲方法定義中的每個代碼段而不是都將立即執行。從方法訪問恆然而,有可能:

module Outer 
    module Inner 
    def self.foo 
     puts BASE_DIR 
    end 
    end 
end 

module Outer 
    BASE_DIR = "cache/" 
end 

Outer::Inner.foo 
# cache/ 

有幾種可能的解決方案,根據您的需要:

  • 杜絕使用恆定之外的方法(可能不是一個選項)
  • 變化加載順序(把require在文件的結尾)
  • 代表所述存儲的全局設置到專用類/模塊
0

不,ruby不這樣做。尋找紅寶石用來解析名字的祖先鏈。

所以你將不得不使用Outer::BASE_DIR來代替。

here是一個關於ruby class系統和rails自動加載的好話題。

+0

試過這個。使用'puts Outer :: BASE_DIR'並得到這個錯誤(幾乎相同):'':未初始化的常量Outer :: BASE_DIR(NameError)' – Chris911

+0

看看@ p11y的答案,問題是與文件的加載順序有關。 ruby對文件和Ruby代碼的加載順序非常敏感。 – phoet