Ruby的根模組命名空間

2021-08-22 05:34:20 字數 1312 閱讀 8421

如果你要定製rails的違例輸出頁面的話的,一般會用這樣的**:

[code]

...def rescue_action_in_public(exception)

case exception

when ::actioncontroller::unknownaction

render_with_layout ....

when activerecord::recordnotfound

...end

endend[/code]

這裡唯一奇怪的地方就是::actioncontroller::unknownaction, 為什麼去掉開頭的::就會報錯說找不到unknownaction?看看原始碼,unknownaction類確實存在於actioncontroller模組中啊。

簡單說,ruby的namespace是從當前位置開始的找起的,而由::開頭訪問的是所謂根模組命名空間(root module namespace),好比絕對路徑。為了便於理解,我們來看個例子:

[code]

class obj

def self.p

"obj"

endend

module test

class obj

def self.p

"test::obj"

endend

class see

def self.p

puts obj.p

puts ::obj.p

endend

end[/code]

在irb中load這段**,並執行

[code]

>> test::see.p

test::obj

obj[/code]

顯然see看見obj會首先在同一命名域下搜尋。而外層的obj是和test同級別的所謂根命名,使用::才能直接引用以區別於test內部的obj。另外如果這時在see.p裡面插一句pp module.constants就能看見根模組空間的內容。

好了,我們已經看見「絕對」和「相對」的區別。回到主題,為什麼不能直接用actioncontroller::unknownaction呢?這裡涉及到rails匯入模組的一些「巫術」,使得當在controller裡用actioncontroller的時候指向的是

actionwebservice::container::actioncontroller。所以要加個::讓ruby知道用的是根級的actioncontroller的。

可見這是個命名衝突的rails bug, 框架應該對使用者隱藏掉這種晦澀的東西。然而這個hack也不失為解決一般的命名衝突情況的辦法。

struts2根命名空間和預設命名空間的區別

如果未指定命名空間,則命名空間預設為 namespace 預設命名空間裡的action可以處理任何命名空間下的action請求。例如,如果存在url為 barspace bar.action的請求,並且 barspace的命名空間下沒有名為bar的action,則預設命名空間下名為bar的actio...

tp框架中的根命名空間

根命名空間是乙個關鍵的概念,例如 think cache driver file類為例,think就是乙個根命名空間,其對應的初始命名空間目錄就是系統的類庫目錄 thinkphp library think 我們可以簡單的理解乙個根命名空間對應了乙個類庫包 分析 載入loader類 require ...

7 1 模組 7 2 命名空間

7.1 模組 我們常常把許多零散的小物件放在乙個盒子裡,或者放在乙個抽屜裡,這些小物件可能是鉛筆,墨水,字典等學習用品,也有可能是不相關的幾件物品。在程式中,相關的 不相關的 的組合,叫作模組。一般情況下,我們總是把功能相關的 放在乙個模組裡。把功能相關的程式 放在乙個模組裡,體現了模組的第乙個作用...