1, "end"=>2}, {"start"=>2, "end"=>3}, {"start"=>3, "end"=>4}, {"s-6ren">
gpt4 book ai didi

ruby - 循环并将散列附加到数组

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

我想像这样创建一个哈希数组:

[
{"start"=>1, "end"=>2},
{"start"=>2, "end"=>3},
{"start"=>3, "end"=>4},
{"start"=>4, "end"=>5},
{"start"=>5, "end"=>6}
]

当我尝试这段代码时:

foo = 1
bar = 2
hash = {}
array = []
5.times do
hash['start'] = foo
hash['end'] = bar
array << hash
foo += 1
bar += 1
end

hash 值在 array 中改变,同时循环和哈希被添加到它。 array 变成:

[
{"start"=>5, "end"=>6},
{"start"=>5, "end"=>6},
{"start"=>5, "end"=>6},
{"start"=>5, "end"=>6},
{"start"=>5, "end"=>6}
]

为什么会发生这种情况:

foo = 1
array = []
5.times do
array << foo
foo += 1
end
array # => [1, 2, 3, 4, 5]

在循环中不改变array中的数字吗?

最佳答案

那是因为散列是可变的。如果你有 foo = {"start"=> 1},并且执行 foo["start"] += 1,那么,foo尽管已修改为 {"start"=> 2},但仍指向相同的散列。它不会更改引用。如果您在一个数组中有同一对象的多个副本,并且更改修改其中一个,那么所有副本都将被修改。

另一方面,数字是不可变的;如果你有 foo = 1,并且执行 foo += 1,那么 foo 现在将指向 2,这是与 1 不同的对象。

关于ruby - 循环并将散列附加到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21017138/

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