🍢
OR演算子と三項演算子の違い
ここどう書こうかな!?と思った時に、そう言えば、この違いってなんだ?と思ったので、メモとして!
※ この記事では、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が返ってくるということです。
まとめ
空文字を許さないなら、三項演算子の方がいいかもです!
変数にどんな値が入ってくる可能性があるかに注意して、演算子やメソッドを使っていきましょう〜
参考
Discussion