gpt4 book ai didi

Ruby 散列活生生的怪异

转载 作者:太空宇宙 更新时间:2023-11-03 16:22:25 24 4
gpt4 key购买 nike

我正在运行 ruby​​ 2.2.2:

$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]

在这里,我使用一个值为 Hash.new({}) 的键 :b 初始化一个散列

irb(main):001:0> a = { b: Hash.new({}) }
=> {:b=>{}}

现在,我将尝试使用键 'foo' 和一个值在 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({}) 返回默认值 {} 有关,但我'我不确定如何解释最终结果...

最佳答案

很抱歉回答我自己的问题,但我知道发生了什么。

这里的答案是,我们分配给a[:b] 返回的默认散列,而不是a[:b] 直接。

和以前一样,我们将使用 b 的单个键和 Hash.new({}) 的值创建一个散列

irb(main):068:0> a = { b: Hash.new({}) }
=> {:b=>{}}

如您所料,这应该使 a[:b][:unknown_key] 返回空哈希 {},如下所示:

irb(main):070:0> a[:b].default
=> {}
irb(main):071:0> a[:b][:unknown_key]
=> {}
irb(main):072:0> a[:b].object_id
=> 70127981905400
irb(main):073:0> a[:b].default.object_id
=> 70127981905420

请注意 a[:b]object_id...5400object_ida[:b].default...5420

那么当我们根据原始问题进行作业时会发生什么?

a[:b][:c]["foo"] = "bar"

首先,解析a[:b][:c]:

irb(main):075:0> a[:b][:c].object_id
=> 70127981905420

这与 .default 对象的 object_id 相同,因为 :c 被视为与 :unknown_key 从上面看!

然后,我们将一个新键 'foo' 和一个值 'bar' 分配到该哈希中。

确实,检查一下,我们已经有效地改变了 default 而不是 a[:b]:

irb(main):081:0> a[:b].default
=> {"foo"=>"bar"}

糟糕!

关于Ruby 散列活生生的怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31622851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com