2009-09-13 66 views
2
def self.get(server) 
    return unless server 
    server = server.to_s 

    if klass = @handlers[server] 
    obj = Object 
    klass.split("::").each { |x| obj = obj.const_get(x) } 
    obj 
    else 
    try_require('rack/handler', server) 
    const_get(server) 
    end 
end 

在上面的code,const_get被用於檢索某種在這條線命名常量:爲什麼klass和const_get一起使用?

klass.split("::").each { |x| obj = obj.const_get(x) } 

如果是這樣,爲什麼「klass」特別是在這裏被使用?我讀過klass用於避免命名空間與「class」關鍵字衝突。但在這個例子中,我沒有看到可能的衝突可能來自哪裏。

+0

我讀過類似的代碼。它被命名爲 'class_name.split(「::」)。each {| x | klass = klass.const_get(x)}' – lulalala 2012-03-06 09:28:40

回答

5

該變量被稱爲klass而不是類,因爲if class = @handlers[server]class.split("::")會導致語法錯誤,因爲如您所說,class是ruby中的關鍵字。

作爲規則的局部變量不能被命名爲喜歡的關鍵字(方法都很好,但他們只能與一個明確的接收機,這就是爲什麼你不能寫的如class.name代替self.class.name調用)。

解析器每次在表達式的開始處看到令牌class時,會將其解釋爲關鍵字。

編輯:澄清:問題不在於此處的類的用法不明確,而是因爲您無法將關鍵字用作本地變量名稱。解析器不會像這樣識別它們。

編輯迴應第二條評論:klass在這裏用作一個局部變量,其值爲@handlers[server]

if @handlers[server] 
    obj = Object 
    @handlers[server].split("::").each { |x| obj = obj.const_get(x) } 

我假設代碼的作者存儲的@handles[server]值的變量:代碼也可以不變量(假設的@handlers[server]值不能在兩個通話之間切換)寫a)不必鍵入@handlers[server]而不是一次,b)向讀者說明該值是一個類,和/或c)避免必須兩次調用@handlers[]

YAEdit:要儘可能消除混亂的最後一點下面的代碼也相當於:

if foo = @handlers[server] 
    obj = Object 
    foo.split("::").each { |x| obj = obj.const_get(x) } 

或者:

foo = @handlers[server] 
if foo 
    obj = Object 
    foo.split("::").each { |x| obj = obj.const_get(x) } 

然而克拉斯是一個更具描述性的變量名比富,所以這是(據推測)爲什麼作者選擇命名變量klass。

+0

衝突在哪裏出現?爲什麼需要class/klass? – uzo 2009-09-13 13:57:15

+0

我想我的困惑是,這裏使用的是什麼?或者如果改爲使用班級,那將需要什麼? – uzo 2009-09-13 15:57:47

相關問題