我可能在这里使用了一个用词不当。我希望在循环的第一次迭代中只设置一次变量,并保留其变量。来自先前迭代的值。
例如,如果未设置,我将变量值设置为0。然后,基于迭代逻辑,值可以改变,并且在下一次迭代中,它将显示上一次迭代的值。
任何想法?感谢。
答案 0 :(得分: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
答案 1 :(得分: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>