初始化散列哈希值

时间:2016-05-10 10:20:43

标签: ruby

假设我有哈希散列如下:

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在创建新密钥时,将值设置为新的空哈希?

2 个答案:

答案 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提供,请点赞。我把它放在这里作为附录。