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 == " " が評価されて真になる。 # そのまま、次にスペースが来るまで真のまま。 # なので偶数番目の単語が「*」で塗りつぶされる |
なるほど。書き捨てのプログラムなら有効活用されることもあるのだろうか?




