最新

val it : α → α = fun

<<  2008/10  >>

2008/10/23 フリップフロップ演算子にはいつも混乱する

http://www.kt.rim.or.jp/~kbk/zakkicho/08/zakkicho0810c.html#D20081022-3

Rubyではブロックローカル変数は繰り返されるごとに初期化される、というだけかと。

>> ([true, false]*3).each{|b| x = "foo" if b; p x}
"foo"
nil
"foo"
nil
"foo"
nil
=> [true, false, true, false, true, false]

で、ここでのキモは (first=true)..false はフリップフロップ演算子なので、

  • 1回目のループでは左辺条件が実行され、trueなので右辺条件が実行され、falseなのでこの条件式自体は真
  • and first なのでif式の条件も真なので実行される
  • 2回目以降は右辺条件だけが実行され、左辺条件は実行されないまま結果は真
  • and first だがfirstはブロックローカル変数なので初期化されていて、代入文が実行されなかったのでnilのままとなり、条件全体は偽になる

ということですね。

それにしてもフリップフロップ演算子って現実的にどれぐらい使われているものなんですかね。使ったことないなあ。