Edited at

Ruby に xor は無かった

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 演算子として働くことは分かってますがな。

問題は,eq1eq2 の評価値が true, false とは限らんちゅうことなんですわ。

整数だったらビット列演算の XOR になるやん?

はー,仕方がないのぅ。論理値を true, false に変換するあれを使うか。

!!eq1 ^ !!eq2

これでいいわけだが,なんか見た目がどうもな。

ちなみに XOR でド・モルガン律みたいのはあるのかな? 無いのか。でも代わりに

P \veebar Q  = \overline P \veebar \overline Q

が成り立つのか(数学で XOR を $\veebar$ って書くの初めて知った)。そりゃそうでしょ,XOR は「真偽の不一致」を表してるんだから。

そうすると,

!eq1 ^ !eq2

でいいわけだ。論理的には。

でもさ,これ 5 年後の自分が見たら「ん? 何やってんの?」って疑問に思うかもしれないな。

しかし,十何年も Ruby を書いてて,今日初めて XOR 演算を書いたよ。