我需要带有键的红宝石哈希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属性
答案 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/