首先要了解有 flip-flop 的返回值是根据下面一个图的最终状态决定的。unset 对应 false,set 对应 true。每次根据上次缓存的状态 (初始是 unset),然后考虑这一次的..(或者...) 的左右 bool 值进行状态调整。最终的状态对应的 bool 值就是返回值(并且写入缓存,以被下次使用) ..和...的主要区别是体现在上一次的状态是 unset, 要处理的表达式是 true..true 的时候,处理结果不一致 ..看到左边是 true,则从 unset 进入 set 状态,然后标记整个表达式返回值为 true,并根据右边表达式的值再次转换到 unset 状态,因此下一次处理的时候,缓存值就是 unset(false). 而...看到左边是 true,则从 unset 进入 set 状态,然后标记整个表达式返回值为 true,并忽略右边表达式的值。。
@luikore 说的很详细,只是输出 log 有下面几处错误 15, false..false, pass 17, true..false, collect 18, true..true, collect
Progmatic Programming Ruby page 138