🍢

OR演算子と三項演算子の違い

2024/07/08に公開

ここどう書こうかな!?と思った時に、そう言えば、この違いってなんだ?と思ったので、メモとして!
※ この記事では、Rubyを使っています。

emailがあればemail、ないときはidを格納したいというケース

email = "hoge@example.com"
id = "123"

OR演算子

OR演算子で書くと

email || id
    => "hoge@example.com"

# emailがないとき
email = nil
email || id
    => "123"

となり、emailがあればemail、ないときはidを返せていそうです。
しかし、emailが空文字だった場合、

email = ""
id = "123"

email || id
    => ""

というように、emailの空の文字列が返ってきてしまいます。
これだと、意図しないデータが格納されてしまう恐れがありそう。。。

つまり、OR演算子を使うときは、「emailがない」というのは存在しないのか、値がないのかということに注意したいですね!

三項演算子

一方、三項演算子で書くとどうなるでしょうか?

三項演算子の場合、条件の真偽によって返り値を判断するものなので、今回の場合は、present?を使って次のように書いてみました。

email = "hoge@example.com"
id = "123"

email.present? ? email : id
    => "hoge@example.com"

これは、email.present?がtrueのとき、emailを返し、falseのとき、idを返します。
では、先ほどの例にようにemailの中が空文字の時は、このようになります。↓

email = ""
id = "123"

email.present? ? email : id
    => "123"

空文字ではなく、idが帰ってきました!
present?は、値といえるものがある(""やnilでない)場合にtrueとなるので、空文字の "" は、falseになるため、idが返ってくるということです。

まとめ

空文字を許さないなら、三項演算子の方がいいかもです!

変数にどんな値が入ってくる可能性があるかに注意して、演算子やメソッドを使っていきましょう〜

参考

https://railsdoc.com/page/empty

Discussion