我想在每個循環迭代中增加我的步進值,但我的解決方案不起作用。如何更改循環內的步進值?
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