Help us understand the problem. What is going on with this article?

Ruby に xor は無かった

More than 1 year has passed since last update.

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 演算を書いたよ。

scivola
主に Ruby 使ってます。 二十年来のコンパイラー恐怖症が Rust で治癒するか?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away