2015-04-07 62 views
0

我可能在這裏使用了一個用詞不當。我希望在循環的第一次迭代中只設置一次變量,並保留其以前迭代的值。例如,如果未設置,我將變量值設置爲0。然後,基於迭代邏輯,該值可以改變,並且在下一次迭代中它將顯示來自先前迭代的值。
有什麼想法?謝謝。Ruby 1.8.7中的靜態循環變量

回答

2

也許我不明白這個問題,你可以在循環前設置變量,然後你可以修改裏面的值。 如果在循環外設置「var」,則可以在所有循環中修改和使用它。

var, run = nil, true 
while run 
    var = 1 unless var 
    puts "IN: #{var}" 

    if var > 1 
    run = false 
    break 
    end 

    var += 1 
end 
puts "OUT: #{var}" 

# => IN: 1 
# => IN: 2 
# => OUT: 2 

也許這樣?您可以使用Proc.new,但它之前是同一行。

process = Proc.new{|var| 
    var = 0 unless var # first set if nil 
    puts "IN: #{var}" 
    var 
} 

run, i = true, 0 
while run 
    var = process.call(var) 
    puts "After process: #{var}" 
    break unless run = (i < 2) 
    var += 1 # logic modify 
    i += 1 
end 

puts "OUT: #{var}" 

# => [true, 0] 
# => IN: 0 
# => After process: 0 
# => IN: 1 
# => After process: 1 
# => IN: 2 
# => After process: 2 
# => OUT: 2 
+0

嗨盧卡斯。這就是我所知道的。我想知道是否有循環內的一種方式。我曾經想過,我已經在循環中讀取了某種方式來執行此操作,並將其保留在循環範圍內。但我可能是錯的。 – user1134991

+0

@ user1134991我不知道,但這可能有所幫助。或者你可以使用實例變量,但我沒有找到關於這個問題的信息。所以也許這不是「簡單」的方式來做到這一點。 –

+0

你爲什麼如此關注範圍?這是一個循環。如果你在裏面聲明瞭一些東西,那就是它的作用域,並且這可能會根據所使用的結構重置每個迭代。通過將它放在循環之外,你可以聲明它的意圖,以便它在迭代之間保持不變。 – tadman

0

這裏有沒有做你想要的另一種方式。

b = binding 
3.times do |i| 
    eval("foo = (foo.nil?) ? 10 : (foo+1)", b) 
    eval("p foo", b) 
    p binding 
end 

它不會像你想要的那樣工作的根本原因是因爲Ruby爲每次通過循環創建一個新的綁定。除了使用外部綁定作爲定位點外,我想不出任何詭計。我使用eval接口來連接外部綁定,僅用於說明。正如你已經知道的,做同樣事情的正確方法是隻在循環外聲明一個變量。

10 
#<Binding:0x00000001708f40> 
11 
#<Binding:0x000000017089a0> 
12 
#<Binding:0x00000001708428> 
+0

爲什麼你需要''eval'這樣的東西?關閉可以完成這項工作。這就像使用手提鑽驅動釘子一樣。 – tadman

+0

我並不是故意暗示這是正確的做法。我試圖說明每個循環迭代的新綁定是最基本的限制。同時表明使用外部靜態綁定「解決」了問題。是的,當然有更好的方法來附加到外部綁定。這只是eval允許明確的附件顯示我的意思。 –

+0

鑑於問題圍繞避免必須在循環外部聲明事物的方法展開,所以這也失敗了。這是一個有趣的方法,但如此瘋狂,現在這種方式應該顯示在生產代碼中。 – tadman