我想使用Ruby的默认哈希值,以便我更容易嵌套哈希,而无需手动初始化它们。我认为能够安全地为每个密钥挖掘一个级别而不必将密钥预先设置为哈希是很好的。但是,我发现当我这样做时,数据会存储在某个地方,但是通过访问顶级哈希是不可见的。它在哪里,它是如何工作的?
top = Hash.new({}) #=> {}
top[:first][:thing] = "hello" #=> "hello"
top[:second] = {thing: "world"} #=> {:thing => "world"}
top #=> {:second => {:thing => "world"}}
top[:first] #=> {:thing => "hello"}
答案 0 :(得分:3)
您想知道插入哈希的位置吗?也许你听说过Schroedingers cat:
h = Hash.new({})
h[:box][:cat] = "Miau"
=> "Miau"
h
=> {}
猫似乎死了......
h[:schroedingers][:cat]
=> "Miau"
猫似乎仍然活着,但在另一个现实......
好的,如果没有任何帮助,"阅读精细手册"。对于Hash.new,我们读到:
如果指定了obj,则此单个对象将用于所有默认值。
因此,当您编写h [:box]时,将返回一个对象,并且此对象是另一个哈希,并且它恰好为空。
在这个空哈希中,你写了一个键值。
现在这个其他哈希不再是空的,它有一个键值对。每当您搜索原始哈希中找不到密钥时,它就会返回。
答案 1 :(得分:2)
您可以通过各种#default方法访问默认值 http://ruby-doc.org/core-2.2.3/Hash.html#method-i-default
top.default
=> {:thing=>"hello"}
答案 2 :(得分:2)
您也可以告诉它您希望它如何行动,例如:
irb(main):058:0> top = Hash.new {|h,k| h[k] = {}; h[k]}
=> {}
irb(main):059:0> top[:first][:thing] = "hello"
=> "hello"
irb(main):060:0> top[:second] = {thing: "world"}
=> {:thing=>"world"}
irb(main):061:0> top
=> {:first=>{:thing=>"hello"}, :second=>{:thing=>"world"}}