我想在每个循环迭代中增加我的步进值,但我的解决方案不起作用。如何更改循环内的步进值?
n=1
(0..100).step(n) do |x|
puts x
n+=1
end
有什么办法可以改变“n”,或者我必须使用“while循环”或其他的?
我想在每个循环迭代中增加我的步进值,但我的解决方案不起作用。如何更改循环内的步进值?
n=1
(0..100).step(n) do |x|
puts x
n+=1
end
有什么办法可以改变“n”,或者我必须使用“while循环”或其他的?
我假设你要打印1,3,6,10,15,21等
迭代超出范围,将每个第n个元素传递给该块。如果范围 包含数字,则为每次迭代添加n。
所以你想要做的事不能用step
完成。 A while
或传统的for
循环应该做的伎俩。
不能用'Range#step'完成,但确实可以用'Numeric#step'完成 – vgoff 2014-10-27 22:41:17
我认为最好的做法是使用while循环。
step = 1
last = 100
i = 0
while (i < last)
puts i
step += 1
i += step
end
可能可以步骤做到这一点,但它需要你完全了解它是如何工作的,并可能使用一些哈克的东西,使其工作。但是当你有一个简单的解决方案时,为什么要这样做呢?
我认为你在问,现在我再看一遍,正在改变step
给予step
方法的块内的参数。这是不可能的,因为在步骤可以继续运行给定块的工作之前,对步骤的参数进行评估,并且分配块变量x
。
下面是基于Aurélien Bottazini's answer定制Enumerator
:
tri = Enumerator.new do |y|
n = 0
step = 1
loop do
y << n
n = n + step
step += 1
end
end
tri.take(10)
#=> [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
tri.take_while { |i| i < 100 }
#=> [0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91]
我不介意这里的无限循环,它在枚举器中,并且被清晰地控制。没有隐藏的“休息”条件。您适当地控制枚举器。 – vgoff 2014-10-29 21:59:38
我怀疑这将是可行的。即使是这样,我也不认为你应该*,因为它打破了“step”这个普遍接受的行为。使用明确的代码。 – 2014-10-27 13:38:49