我在运行以下循环时遇到以下意外行为:

outside_var = 'myString'
loop do
  inside_var ||= outside_var
  result = SomeCalculation.do_something(inside_var)
  inside_var = result[:new_inside_var_value]
end

现在,在第一次迭代中inside_var被设置为outside_var ,这是预期的行为。 就在下一次迭代之前,我将inside_var设置为其他内容(取决于我从循环内部计算得到的结果)。 此分配有效(在循环的最底部打印inside_var确认了这一点)。 然而,在下一次迭代中, inside var 返回到原始状态,这是我没有预料到的。 为什么要这样做,我如何在这个循环中设置这个变量?

我正在使用 Rails 6 运行 Ruby 2.6.5。

#1楼 票数:1

这是一个范围界定问题。 inside_var的范围是块。 人们可能会检查绑定,它会改变。

outside_var = 'myString'
2.times do
  puts "INSIDE 1: #{defined?(inside_var).nil?} → #{binding}"
  inside_var ||= outside_var
  puts "INSIDE 2: #{inside_var}"
end
#⇒ INSIDE 1: true → #<Binding:0x000055a3936ee0b0>
#  INSIDE 2: myString
#  INSIDE 1: true → #<Binding:0x000055a3936edc50>
#  INSIDE 2: myString

也就是说,每次执行进入块时,绑定都会重置,这就是为什么不应该期望来自另一个范围(具有另一个绑定)的变量存在的原因。

#2楼 票数:0 已采纳

当您在循环内进行新的迭代时,您将重置所有内容。 我建议您修改循环外的 var 以保留内部的值。 像这样的东西:

result_var = 'myString' # value on the first iteration
loop do
  result = SomeCalculation.do_something(result_var)
  result_var = result[:new_inside_var_value] # at the end of the first iteration you are already overriding this value
end

  ask by Severin translate from so

未解决问题?本站智能推荐:

2回复

如何在循环内重置局部变量的值?

我想指出我进行了相当广泛的寻找以找到一个解决方案,我得到的最接近的是这个 。 但是我看不到如何使用map来解决我的问题。 我是Ruby的新手,所以请记住这一点。 这是我正在使用的一些代码(简体): 我需要在每个周期之后将input_text的值重置为input_char_array的
5回复

在循环外重置计时器

我已经为要计时的功能设置了计时器,但希望在满足条件后将其重置 因此,在上面的示例中,我希望计时器在1分钟后重置
4回复

在Ruby中重置循环,还是返回循环开始?(查找数字因素)

我正在尝试查找数字N的因数。我希望能够遍历我的质数数组,并且当满足条件时,请返回到迭代的开始,而不是继续进行下去。 如何在Ruby 1.8.6中做到这一点? (我注意到1.8.7中有一个“循环”枚举数可能与之相关吗?) PS 我知道以下算法尚不完善(我认为我需要提供N = 1)。
2回复

带变量分配的While循环

使用变量赋值的while循环如何工作? 这是我看到的一个例子。 我理解除了5-10线的一切。 只是一步一步的指导如何执行将是非常有帮助的。
1回复

Jekyll中的循环和变量如何?

当我比较时,如果post.category就好像有一个帖子那个变量更多的是当我放{{post.category}}时它打印出名字。 如果我放入,如果site.post.category处理所有值,那就好像他不存在。 问题是我希望得到当前帖子来比较该类别。 我想按类别列出帖子。 <di
2回复

循环内循环并在深循环中分配变量

我有一块像这样的代码(这是工作版本) 当我尝试在sessions_hash.each语句中设置变量event_id ,我无法将其分配到该循环之外(获得未知变量警告)。 我想知道为什么会这样,以及如何规避它。 下面是一个失败的例子(事件虽然日志显示变量设置正确),但我没有在创建它的循环之
2回复

Ruby循环作为变量或uri增量

这是我的查询: 我有一个网址示例: http : //www.abcde.com/dir/go.php?id=1 我对URI.parse和URI.escape使用“ open-uri”进行请求。 我想对网址进行迭代,例如: 等等。抱歉,我的英语水平,请尝试过去3个小时。 如您
1回复

将变量外循环存储在ruby中

我正在尝试将结果存储在变量中,这样我就可以在循环外引用它,并且无法在我的一生中发挥作用,我们将不胜感激 请参阅下面的代码