循环打印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
)为假,因此触发器不会打开(另外,在循环之外使用触发器没有实际意义)。