Ruby で条件式として XOR(eXclusive OR;排他的論理和)演算を書く必要ができた。
えっと,xor
なんて演算子あったっけ?と思ったら無かった。
そうか,じゃあ &&
, ||
があるんだから ^^
かな? 見たことないけど。と思ったらこれも無かった。
ええーっ!! 無いんかい。
め,めどい。
えっと,eq1
, eq2
を何らかの式とする。評価値を論理値として使い,
eq1 xor eq2
と書きたかった。
えーとまさか
(eq1 || eq2) && !(eq1 && eq2)
とか。誰が書くかい!
え? なに? ^
を使えだって?
そりゃまあ
true ^ true # => false
true ^ false # => true
false ^ true # => true
false ^ false # => false
だから,こいつが XOR 演算子として働くことは分かってますがな。
問題は,eq1
や eq2
の評価値が true
, false
とは限らんちゅうことなんですわ。
整数だったらビット列演算の XOR になるやん?
はー,仕方がないのぅ。論理値を true
, false
に変換するあれを使うか。
!!eq1 ^ !!eq2
これでいいわけだが,なんか見た目がどうもな。
ちなみに XOR でド・モルガン律みたいのはあるのかな? 無いのか。でも代わりに
P \veebar Q = \overline P \veebar \overline Q
が成り立つのか(数学で XOR を $\veebar$ って書くの初めて知った)。そりゃそうでしょ,XOR は「真偽の不一致」を表してるんだから。
そうすると,
!eq1 ^ !eq2
でいいわけだ。論理的には。
でもさ,これ 5 年後の自分が見たら「ん? 何やってんの?」って疑問に思うかもしれないな。
しかし,十何年も Ruby を書いてて,今日初めて XOR 演算を書いたよ。