2009-12-07 109 views
-2

我需要一個紅寶石哈希H與鍵:a,:b,:c,以便H [:b] = H [:a] + 1; H [:c] = H [:b] + 2等。紅寶石散列與自引用元素/遞歸散列

如何在一行聲明中定義這樣的散列,如H = {:a => 1,:b => H [:a ] + 1,:c => H [:b] +2,...}?

我需要類似的DataMapper財產申報的內容:

屬性:路徑,文件路徑

屬性:的md5sum,字符串:默認=>拉姆達{| R,P |摘要:: MD5.hexdigest(r.path.read)}

其中:的md5sum默認值引用:path屬性

回答

0

這是最好的,我可以這樣做:

arr = [[:a,1], [:b,1], [:c,2]]; H = {:temp => 0} 
arr.inject(:temp) { |last, kv| H[kv[0]] = H[last] + kv[1]; kv[0] } 
H.delete :temp 

很醜陋,它的作用並不那麼明顯。我建議你只是直截了當地去做,除非它真的有那麼多問題。

0

目前尚不清楚你正在努力完成什麼。 請注意,散列可以有一個默認的proc。例如:

require 'digest/md5' 
h = Hash.new do |hash, key| 
    hash[:md5sum] = Digest::MD5.hexdigest(hash[:path]) if key == :md5sum 
end 

h[:path] = "/starway/to/heaven" 
h[:md5sum] # ==> "0e4faf226dac83569bde4fcf5bcd7ad6" 
h[:md5sum] = "xyz" 
h[:md5sum] # ==> "xyz" 
+0

做這件事的方式是: H = {}; H [:a] = 1; H [:b] = H [:a] + 1; H [:c] = H [:b] + 2;等 我只是想知道是否散列H(其元素引用一些其他元素相同的散列)的聲明和初始化可以在一行完成 - 所有在同一時間在一個地方。 – alpinweis 2009-12-07 18:45:34

+0

也許如果你發佈了一個真實的例子,它會更清晰。 :a,:b,+1等。可能不是你在這裏做的! – 2009-12-07 20:23:36