2013-03-07 25 views
0

例如Ruby的內部類的Hash

class C1 
    class Hash 
     def ok? 
      return 'nested hash ok' 
     end 
     end 
    def m1 
     return Hash.new.ok? 
    end 
    def m2 
     return {}.ok? 
    end 
end 

的C1.new.m1工作,但C1.new.m2沒有。在命名空間中有什麼不同的含義?

+0

如果我想要的是添加方法「好嗎?」轉換爲散列,但只適用於C1類,它是子類。如何做到這一點? – Yehudi 2013-03-07 03:45:01

回答

3

您只需創建一個名爲Hash的新類,它嵌套在C1的內部。

您沒有像預期的那樣向Ruby的Hash類添加方法。 如果你想這樣做,請將class Hash移到C1以外並重新運行:代碼將按預期執行。

正如您當前的代碼所示,假定您將嵌套類命名爲MyThing。現在,你不會工作{}.ok?工作,你會嗎?

因此,要回顧:

這會工作:

class Hash 
    def ok? 
    return 'non-nested hash ok' 
    end 
end 
class C1 
    def m1 
     return Hash.new.ok? #WORKS 
    end 
    def m2 
     return {}.ok? #WORKS 
    end 
end 

這將失敗:

class C1 
    class MyThing 
     def ok? 
     return 'nested hash ok' 
     end 
    end 
    def m1 
     return MyThing.new.ok? #WORKS 
    end 
    def m2 
     return {}.ok? #FAILS 
    end 
end 
+0

通過指定全局命名空間,您可以在'C1'內編輯內建的'Hash'類。 'class :: Hash' – Max 2013-03-07 05:08:11

0
class C1 
    class Hash # defines C1::Hash 
    def ok? 
     return 'nested hash ok' 
    end 
    end 

    def m1 
    return Hash.new.ok? # refers to C1::Hash 
    end 

    def m2 
    return {}.ok? # refers to Hash 
    end 
end 

沒有基於命名空間的類混合。他們是分開的。