【发布时间】:2014-01-09 10:09:21
【问题描述】:
我想创建一个这样的哈希数组:
[
{"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 内的数字?
【问题讨论】:
-
使用
array << hash.dup而不是array << hash因为您在这里添加的只是对哈希的引用,而不是哈希本身。 -
我会使用
(1..6).each_cons(2).map { |a, b| { start: a, end: b } }
标签: ruby