Ruby 无限循环
Ruby Infinite While Loop
我的目标是获取多维数组中的每个元素,创建 12 个将被处理的副本(不改变原始值),将处理后的值追加到数组中,并在必要时重复以满足所需的总数值:
total = 4
arr = Array.new(1) { Array.new(3, 127.5) }
while arr.count < total
tmp = arr
tmp.each do |item|
new_arr = Array.new(12, item)
#processing the 12 arrays I just created would happen here
arr.concat new_arr
puts arr.count
end
end
这部分代码创建了一个无限循环。我不明白为什么。
您的问题是将 tmp
分配给 arr
。它们与您在此处看到的对象相同:
> arr = [1,2,3]
=> [1, 2, 3]
> tmp = arr
=> [1, 2, 3]
> arr.concat([4,5,6])
=> [1, 2, 3, 4, 5, 6]
> tmp
=> [1, 2, 3, 4, 5, 6]
您需要根据需要使用 dup
或 clone
来制作数组的副本
如果您这样做 tmp = arr.dup
它应该可以解决您的问题。
arr
和 tmp
是同一个对象。添加到 arr
时,tmp
会增长,因此有新的子数组供 tmp.each
处理。
您的无限循环正在发生,因为您在其中的第二个循环中向数组添加项目,因此后续迭代将作用于先前添加的条目。此外,当您执行 'tmp = arr' 时,您并不是在复制 arr,而是在设置引用。检查一下,看看是否有帮助:
> arr = ['test','test1','test2']
=> ["test", "test1", "test2"]
> tmp = arr
=> ["test", "test1", "test2"]
> arr << 'test3'
=> ["test", "test1", "test2", "test3"]
> tmp
=> ["test", "test1", "test2", "test3"]
> tmp = arr.dup
=> ["test", "test1", "test2", "test3"]
> arr << 'test3'
=> ["test", "test1", "test2", "test3", "test3"]
> tmp
=> ["test", "test1", "test2", "test3"]
考虑到这一点,也许您可以尝试以下操作:
total = 4
original_arr = Array.new(1) { Array.new(3, 127.5)}
new_arr = []
total.times do |i|
original_arr.each do |v|
new_arr << Array.new(12, v)
puts i
end
end
只需使用
arr += new_arr
而不是
arr.concat new_arr
我的目标是获取多维数组中的每个元素,创建 12 个将被处理的副本(不改变原始值),将处理后的值追加到数组中,并在必要时重复以满足所需的总数值:
total = 4
arr = Array.new(1) { Array.new(3, 127.5) }
while arr.count < total
tmp = arr
tmp.each do |item|
new_arr = Array.new(12, item)
#processing the 12 arrays I just created would happen here
arr.concat new_arr
puts arr.count
end
end
这部分代码创建了一个无限循环。我不明白为什么。
您的问题是将 tmp
分配给 arr
。它们与您在此处看到的对象相同:
> arr = [1,2,3]
=> [1, 2, 3]
> tmp = arr
=> [1, 2, 3]
> arr.concat([4,5,6])
=> [1, 2, 3, 4, 5, 6]
> tmp
=> [1, 2, 3, 4, 5, 6]
您需要根据需要使用 dup
或 clone
来制作数组的副本
如果您这样做 tmp = arr.dup
它应该可以解决您的问题。
arr
和 tmp
是同一个对象。添加到 arr
时,tmp
会增长,因此有新的子数组供 tmp.each
处理。
您的无限循环正在发生,因为您在其中的第二个循环中向数组添加项目,因此后续迭代将作用于先前添加的条目。此外,当您执行 'tmp = arr' 时,您并不是在复制 arr,而是在设置引用。检查一下,看看是否有帮助:
> arr = ['test','test1','test2']
=> ["test", "test1", "test2"]
> tmp = arr
=> ["test", "test1", "test2"]
> arr << 'test3'
=> ["test", "test1", "test2", "test3"]
> tmp
=> ["test", "test1", "test2", "test3"]
> tmp = arr.dup
=> ["test", "test1", "test2", "test3"]
> arr << 'test3'
=> ["test", "test1", "test2", "test3", "test3"]
> tmp
=> ["test", "test1", "test2", "test3"]
考虑到这一点,也许您可以尝试以下操作:
total = 4
original_arr = Array.new(1) { Array.new(3, 127.5)}
new_arr = []
total.times do |i|
original_arr.each do |v|
new_arr << Array.new(12, v)
puts i
end
end
只需使用
arr += new_arr
而不是
arr.concat new_arr