if (hoge == :fuga)..(foo == :bar) みたいに、ifの条件式にRangeのリテラル(..とか...)が入っているヤツ。

「フリップフロップとして働く」とか言われても良く分からなかったのだが、以下の説明でわかった。

条件式として範囲式が用いられた場合には、式1が真になるま では偽を返し、その後は式2が真を返すまでは真を返します。式2が 真になれば状態は偽に戻ります。..は式1が真になっ た時にすぐに式2を評価し(awkのように)、 ... は次の 評価まで式2を評価しません(sedのように)。

http://www.ruby-lang.org/ja/man/html/_B1E9BBBBBBD2BCB0.html#a.c8.cf.b0.cf.bc.b0

こういうことなのだろう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
str = "web development that does not hurt"
 
str.each_char do |c|
  if (c == " ")..(c == " ") # …(1)
    print "*"
  else
    print c
  end
end
#=> web*development*that*does*not*hurt
# (1)は、スペースにぶつかると前の c == " " が評価されて真になり、
# すぐに後ろの c == " " が評価され、次の文字からは偽に戻る。
# なのでスペースだけ「*」に変換される形
 
str.each_char do |c|
  if (c == " ")...(c == " ") # …(2)
    print "*"
  else
    print c
  end
end
#=> web*************that******not*****
# (2)は、スペースにぶつかると前の c == " " が評価されて真になる。
# そのまま、次にスペースが来るまで真のまま。
# なので偶数番目の単語が「*」で塗りつぶされる

なるほど。書き捨てのプログラムなら有効活用されることもあるのだろうか?