所以这里有一个infinte循环,但我没有看到它。
# Return an array that doubles each number
numbers = [1, 2, 3, 4]
numbers.each do |number|
numbers << number * 2
end
puts numbers
我知道有更短的方法可以做到这一点,但我正在学习所有这些都是更明确地写出来的。
答案 0 :(得分:5)
您在迭代该数组时向数组添加元素。这是therefore impossible to reach the end。
您需要做的是使用int *
功能:
map
使用其值乘以2更新每个条目。
如果您想添加一组加倍的数字:
numbers.map! do |n|
n * 2
end
这会增加一个已加倍的数组副本。
修改:出于学术插图的目的,您可以尝试使用numbers += numbers.map do |n|
n * 2
end
的副本,而不是使用map
:
dup
您也可以按顺序迭代它:
numbers.dup.each do |n|
numbers << n * 2
end
与numbers.each_index do |i|
numbers << numbers[i] * 2
end
版本相比,它们效率低得多且难以阅读。
答案 1 :(得分:1)
你无法看到这个过程,因为这个无限永远存在,永远不会达到你的puts numbers
陈述。这就是为什么你不能在控制台中看到它。
尝试类似:
numbers = [1, 2, 3, 4]
numbers.each do |number|
numbers << number * 2
puts numbers
end
看到你的电脑疯了:)
答案 2 :(得分:0)
通过按下数组中的doubled值,每次增加数组大小为1.因此发生无限循环。我想你真正想做的是
numbers.each do |num|
puts num *2
end
答案 3 :(得分:0)
返回一个数字加倍每个数字
假设您不想使用map
,可以使用Enumerable#each_with_object
:
numbers = [1, 2, 3, 4]
numbers.each_with_object([]) { |n, o| o << n + n }
#=> [2, 4, 6, 8]
答案 4 :(得分:0)
由于没有人提到明显的答案,这里是:
numbers = [1, 2, 3, 4]
double_numbers = []
numbers.each do |number|
double_numbers << number * 2
end
p double_numbers
# [2, 4, 6, 8]
如果您不了解map
或map!
,这将是您的方法。请注意,您迭代一个数组并创建另一个数组,以避免弄乱each
循环。