【发布时间】:2015-07-25 04:14:56
【问题描述】:
我正在运行 ruby 2.2.2:
$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
这里我用一个键 :b 初始化一个哈希值 Hash.new({})
irb(main):001:0> a = { b: Hash.new({}) }
=> {:b=>{}}
现在,我将尝试使用键 'foo' 和值 'bar' 自动激活 a[:b][:c] 的另一个哈希
irb(main):002:0> a[:b][:c]['foo'] = 'bar'
=> "bar"
此时,我预计 a 将包含类似以下内容:
{ :b => { :c => { 'foo' => 'bar' } } }
但是,我看到的不是这样:
irb(main):003:0> a
=> {:b=>{}}
irb(main):004:0> a[:b]
=> {}
irb(main):005:0> a[:b][:c]
=> {"foo"=>"bar"}
这与以下不同:
irb(main):048:0> a = { :b => { :c => { "foo" => "bar" } } }
=> {:b=>{:c=>{"foo"=>"bar"}}}
irb(main):049:0> a
=> {:b=>{:c=>{"foo"=>"bar"}}}
那么这里发生了什么?
我怀疑这与Hash.new({}) 返回默认值{} 有关,但我不确定如何解释最终结果...
【问题讨论】:
-
请在此处阅读接受的答案:stackoverflow.com/questions/5878529/… 它对行为有很好的解释。在您的示例中,尝试打印
a[:b][:x] -
啊,直到我起草完我的答案才注意到这条评论。你是对的,这也很重要。谢谢!
-
我的姑姑曾经告诉我,自动复活是 Perl 的东西。我不熟悉 Ruby 上下文中的术语。
-
@CarySwoveland 抓住了我! :)