gpt4 book ai didi

ruby - 使用空数组作为默认值初始化 Ruby 哈希

转载 作者:行者123 更新时间:2023-12-04 17:43:21 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Strange, unexpected behavior (disappearing/changing values) when using Hash default value, e.g. Hash.new([])

(4 个回答)



Initializing a Hash with empty array unexpected behaviour [duplicate]

(1 个回答)


3年前关闭。




当我使用默认值(如 0)初始化 Ruby 散列并在散列中创建一个新条目并递增时,它会按预期运行:

irb(main):001:0> h1 = Hash.new(0)
=> {}
irb(main):002:0> h1[:foo] += 1
=> 1
irb(main):003:0> h1
=> {:foo=>1}
irb(main):004:0> h1[:foo]
=> 1

注意如何 h1 #=> {:foo=>1}h1[:foo] #=> 1 .这就是我期待看到的。

除非我使用空数组的默认值,否则会发生以下情况:
irb(main):005:0> h2 = Hash.new([])
=> {}
irb(main):006:0> h2[:foo] << "cats"
=> ["cats"]
irb(main):007:0> h2
=> {}
irb(main):008:0> h2[:foo]
=> ["cats"]

注意如何 h2 #=> {}h2[:foo] #=> ["cats"] .我不知道为什么会这样。
  • 这里发生了什么?
  • 为什么 h2 看起来像一个空的散列,但仍然有一个带有键 :foo 的值?

  • 如果我使用一些块,则会发生预期的行为:
    irb(main):001:0> h3 = Hash.new {|hash, key| hash[key] = [] }
    => {}
    irb(main):002:0> h3[:foo] << "cats"
    => ["cats"]
    irb(main):003:0> h3
    => {:foo=>["cats"]}
    irb(main):004:0> h3[:foo]
    => ["cats"]

    注意如何 h2 #=> {:foo=>["cats"]}h3[:foo] #=> ["cats"] .这就是我期待看到的。

    最佳答案

    answerHash.new .简而言之:

    If obj ([] in your case) is specified, this single object will be used for all default values. If a block is specified, it will be called with the hash object and the key, and should return the default value. It is the block's responsibility to store the value in the hash if required.



    使用块初始化以设置非零默认值。

    关于ruby - 使用空数组作为默认值初始化 Ruby 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53384505/

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