假设我有哈希散列如下:
order_history = {}
order_history[customer_id][order_id] = { :total_spend => order_spend, :date => order_date }
当我在这个哈希中添加条目时,我必须先检查customer_id是否存在,如下所示:
order_history[customer_id] = {} unless order_history.has_key?(customer_id)
然后,我可以添加单个订单的详细信息:
order_history[123][456] = { :total_spend => 200.45, :date => 2016-05-03 }
是否可以在开始时将order_history哈希声明为哈希哈希值,因此我不必每次都进行测试?或者有没有办法告诉ruby在创建新密钥时,将值设置为新的空哈希?
答案 0 :(得分:3)
您可以尝试使用此哈希:
h = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
h['bar'] -> {}
h['tar']['star']['par'] -> {}
有关详细信息,请参阅此post
答案 1 :(得分:0)
虽然@XavM提供的答案完全回答了这个问题,但我会在这里提到优秀的Hashie#Mash
。使用后者,可以使用字符串键:
▶ require 'hashie/mash'
▶ hm = Hashie::Mash.new
#⇒ {}
▶ hm.foo.bar
#⇒ NoMethodError: undefined method `bar' for nil:NilClass
但:
▶ hm.foo!.bar
#⇒ nil
▶ hm.foo!.bar!
#⇒ {}
有时它比定义default_proc
更方便。
NB OP中提出的问题的正确答案由@XavM提供,请点赞。我把它放在这里作为附录。