2008-10-04 464 views
34

創建在紅寶石散列的散列允許方便兩個(或更多)維查找。但是,插入時必須始終檢查散列中是否存在第一個索引。例如:哈希成語在Ruby中的哈希值?

h = Hash.new 
h['x'] = Hash.new if not h.key?('x') 
h['x']['y'] = value_to_insert 

這將是可取的地方,會自動創建新的Hash做到以下幾點:

h = Hash.new 
h['x']['y'] = value_to_insert 

同樣,查找其中第一個索引不存在的值時,如果返回nil,而不是接收'[]'錯誤的未定義方法,那將會更好。

looked_up_value = h['w']['z'] 

可以創建一個具有此行爲的哈希包裝類,但是是否存在用於完成此任務的現有Ruby成語?

+0

是否有一個哈希散列成語在特定深度之後會返回0嗎? (我計數的東西和我使用H [:FOO] [:巴] [:巴茲] + = 1) – 2010-01-11 00:15:32

回答

54

您可以通過Hash.new功能被執行產生的情況下,查詢的值不存在默認值的模塊:

h = Hash.new { |h, k| h[k] = Hash.new } 

。當然,這是可以完成遞歸。

/編輯:哇,有an article回答過這個問題。

爲了完整起見,這裏是從文章的解決方案,任意深度的哈希值:

hash = Hash.new(&(p=lambda{|h,k| h[k] = Hash.new(&p)})) 

現金去肯特從Data Noise

+1

哇。這很讓人佩服。 – 2009-12-02 09:28:26

4

自動激活,因爲它叫,既是祝福和詛咒。該故障可能,如果你「看」它被定義之前的值,你就完蛋了與插槽這個空哈希,你會需要在以後進行清理,關閉。

如果你不介意有點混亂,你永遠可以在或-等於樣式聲明,這將使你構建預期的結構,你查詢它果醬:

((h ||= { })['w'] ||= { })['z']