循环和单次运行之间的区别



循环打印23401,但最后一行不打印:

[2,3,4,0,1].each do |value|
print value if value==2...value==2
end
print true if 3==2...3==2

我想知道是什么问题

我已经尝试了很多循环,并且我发现条件一旦为真就总是为真

这个value==2...value==2可能看起来像一个标准的Range;然而,if (condition)...(condition)的语法实际上是一个称为Flip-Flop的控制表达式。

触发器的形式是一个表达式,表示触发器何时打开,..(或...),然后是一个表达式,表示触发器何时关闭。当触发器打开时,它将继续计算true,关闭时计算false

有两种形式:2点(..)和3点(...)。

  • 2点(..)表示:"…当on条件发生变化时,计算off条件。和
  • 3个点(...)表示:"…在以下迭代中计算关闭条件">

2点形式(..)触发器

[2, 3, 4, 0, 1].each do |value|
print value if (value == 2)..(value == 2)
end
# 2

因为第一次迭代只在这个迭代中打开触发器,例如,左边(打开)2 == 2,右边(关闭)2 == 2,所以它在同一个迭代中打开、求值和关闭。

触发器的3点形式(...),如您的示例

[2, 3, 4, 0, 1].each do |value|
print value if (value == 2)...(value == 2)
end
# 23401

由于第一次迭代打开触发器,例如左侧(打开)2 == 2,但右侧(关闭)value == 2直到后续迭代才被计算,并且由于数组中没有其他元素满足value == 2,因此不会关闭。

如果数组中存在另一个满足off条件的元素:

[2, 3, 4, 2, 0, 1].each {|value| print(value) if (value == 2)...(value == 2) } 
# 2342
<标题>

额外h1>…但是最后一行不打印:

您的最后一行不打印,因为左侧(3 == 2)为假,因此触发器不会打开(另外,在循环之外使用触发器没有实际意义)。

最新更新