2012-11-20 40 views
0

我有一個派生自哈希的類。當我在IRB中使用它時,它將散列的內容轉儲到控制檯。相反,我希望它以#<MyHash:0x201e4c0>的形式打印與Object.inspect/.to_s(不確定哪一個)相同的方式。我如何實現這一目標?對派生自哈希的類使用Object.inspect/Object.to_s

編輯我不得不刪除第二個問題,因爲它導致了混淆。上面的問題是我需要回答的。這是我刪除的內容:

有沒有辦法在繼承層次結構中調用上層類的方法?

回答

3

一個寫一個新的類時要與他人分享的基本家務是定義一些基本的方法,其中#inspect#to_s#==#<=>和其他幾個人。所以你自己必須在編寫新課程時編寫你的inspect函數。

這麼多爲你的職責。但現在,你的問題,它一般可被說明爲如何利用一類深祖先的方法,一種方法是這樣的:

class MyHash < Hash 
    def inspect 
    Object.instance_method(:inspect).bind(self).call 
    end 
end 

在這裏,要求是MyHashObject後裔,否則UnboundMethod實例將不會綁定到它。 (爲Object,這顯然是正確的,但可能不會在一般的情況下)。

新版評論AFTER:

上面的代碼允許MyHash調用對象的實例方法inspect。要大力percieve的效果,一個有方法to_s,這是由對象#稱爲重複該過程檢查:

class MyHash < Hash 
    def inspect 
    Object.instance_method(:inspect).bind(self).call 
    end 
end 

h = MyHash[ a: 1, b: 2 ] 
#=> {:a=>1, :b=>2 } 
# The above code did work, but Object#inspect happens to call to_s() instance method 
# To see the change 

class MyHash 
    def to_s 
    Object.instance_method(:to_s).bind(self).call 
    end 
end 

h.inspect 
#=> "#<MyHash:0x90ee01c>" 
+0

我想你的代碼片段在IRB,它仍然轉儲哈希的內容到控制檯。我究竟做錯了什麼? – mydoghasworms

+0

另外,你可以在Ruby中定義一個不是Object的後代的類嗎? – mydoghasworms

+0

確實,你在OP中有兩個問號結束語句,第一個是「我如何實現這個?」,第二個「有沒有辦法......?」。我的代碼片段是第二個(一個可能的)答案。要回答第一個問題,請執行以下操作:to_s方法,對象#檢查依賴於該方法。 –