带有自引用元素/递归哈希的ruby哈希

时间:2009-12-07 08:20:29

标签: ruby hash recursion

我需要带有键的红宝石哈希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属性声明的东西:

property:path,FilePath

property:md5sum,String,:default => lambda {| r,p |文摘:: MD5.hexdigest(r.path.read)}

其中:md5sum默认值引用:path属性

3 个答案:

答案 0 :(得分: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

非常丑陋,它的作用并不那么明显。我建议你这样做是直截了当的,除非它确实是一个很大的问题。

答案 1 :(得分: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"

答案 2 :(得分:0)

听起来你可能想要懒惰的声明:http://moonbase.rydia.net/software/lazy.rb/