2014-10-27 70 views
4

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

n=1 
(0..100).step(n) do |x| 
puts x 
n+=1 
end 

有什麼辦法可以改變「n」,或者我必須使用「while循環」或其他的?

+6

我懷疑這將是可行的。即使是這樣,我也不認爲你應該*,因爲它打破了「step」這個普遍接受的行爲。使用明確的代碼。 – 2014-10-27 13:38:49

回答

6

我假設你要打印1,3,6,10,15,21等

step documentation說:

迭代超出範圍,將每個第n個元素傳遞給該塊。如果範圍 包含數字,則爲每次迭代添加n。

所以你想要做的事不能用step完成。 A while或傳統的for循環應該做的伎倆。

+0

不能用'Range#step'完成,但確實可以用'Numeric#step'完成 – vgoff 2014-10-27 22:41:17

2

我認爲最好的做法是使用while循環。

step = 1 
last = 100 
i = 0 
while (i < last) 
    puts i 
    step += 1 
    i += step 
end 

可能可以步驟做到這一點,但它需要你完全瞭解它是如何工作的,並可能使用一些哈克的東西,使其工作。但是當你有一個簡單的解決方案時,爲什麼要這樣做呢?

2

我會loop做和break

n = 0 
step = 1 
loop do 
    puts n 
    n = n + step 
    step += 1 
    break if n > 100 
end 
+1

這可以很好地包裝在一個自定義的'枚舉器'。 – Stefan 2014-10-27 14:41:27

+0

當你有一個很好的條件語句時,爲什麼使用'break'和一個無限''loop'',你可以使用'while'或'until'語句? – vgoff 2014-10-28 07:57:58

+0

我首先用〜開始,而〜和rubocop建議使用〜loop〜。我發現它很有趣。 – 2014-10-28 08:46:32

0

我認爲你在問,現在我再看一遍,正在改變step給予step方法的塊內的參數。這是不可能的,因爲在步驟可以繼續運行給定塊的工作之前,對步驟的參數進行評估,並且分配塊變量x

+0

你可以在這個例子中調整'':' – 2014-10-27 23:43:04

+0

遞增,如+ 1,+ 2,+ 3,否,不是動態的。不,在運行時不是遞增的。一段時間或直到循環會更好,現在我再次看。 – vgoff 2014-10-28 07:36:04

+0

當他說「在每個循環迭代」中表示循環迭代內部時,我不會將其重新定義爲循環迭代,而是錯誤地提出了他的問題措詞。但我認爲他的意思是後者。但是,這是不可能的,因爲'n'變量的範圍是不同的事情,首先。 – vgoff 2014-10-28 07:51:39

3

下面是基於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] 
+0

我不介意這裏的無限循環,它在枚舉器中,並且被清晰地控制。沒有隱藏的「休息」條件。您適當地控制枚舉器。 – vgoff 2014-10-29 21:59:38