2009-12-07 105 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