2012-03-20 55 views
-1

我試圖理解下面會產生什麼。根據IRHG,這段代碼將返回A1。Ruby常量和嵌套類

IRHG說:常量是在班級以外的第一個搜索。如果沒有找到 以外,那麼在課堂內搜索。

但我在Ruby中得到了以下信息1.8.7

未初始化的常數A3 :: B3 :: C3 ::常量(NameError)

請你幫忙我正確理解這一點?

class A1 
    Const = "A1" 
end 
class A2 < A1 
end 
class A3 < A2 
    #Const = "A3" 
    class B1 
    end 
    class B2 < B1 
    end 
    class B3 < B2 
     class C1 
     end 
     class C2 < C1 
     end 
     class C3 < C2 
      p Const 
     end 
    end 
end 
+2

他們正在尋找其他* *類像裏面沒有說'A1',這將完全擊敗命名空間的目的。嘗試完全限定的名稱 - 「:: A1 :: Const」。 – 2012-03-20 14:24:06

+0

但是根據IRHG,它會返回A1,爲什麼當我運行代碼時它沒有返回它。 – Dean 2012-03-22 18:12:50

+0

我認爲你指的是「常量和嵌套類」一節中顯示的圖形。這只是錯誤的。 – 2012-03-22 18:17:28

回答

1

在你的情況下,C3類不是繼承自A3類。 A3類只是C3的一個命名空間。

A3::B3::C3.superclass 
#=> A3::B3::C2 
A3::B3::C3.superclass.superclass 
#=> A3::B3::C1 
A3::B3::C3.superclass.superclass.superclass 
#=> Object 
# or you can look A3::B3::C3.ancestors for full map 

雖然

A3.superclass 
#=> A2 
A2.superclass 
#=> A1 

所以,當你把一個類中的另一個你不繼承,但窩類

+0

但是根據IRHG,它會返回A1,爲什麼當我運行代碼時它沒有返回它。 – Dean 2012-03-22 18:13:04