Ruby 1.8.7中的静态循环变量

时间:2015-04-07 08:53:16

标签: ruby loops variables scope

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

2 个答案:

答案 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>