LoginSignup
5

More than 5 years have passed since last update.

論理演算子OR で条件を書くとださくなっちゃうときの自分なりの解決法

Last updated at Posted at 2016-03-29

論理演算子OR で条件を書くとださくなっちゃうときの自分なりの解決法です。
あくまで個人的にこっちのほうがいいんじゃね!?という突発的な投稿なので、あしからず。

まず、前提として、このような条件文があったとします。

変数teamに入っている値が :dortmundか:milanの時にtrue

普通に書くなら、こうですね。

team == :dortmund || team == :milan

ついついこう書きたくなっちゃいますが、これはだめ

team == :dortmund || :milan

先に team == :dortmundが評価され、
もしtrueだったらtrueが返り、
もしfalseだったら、|| の右辺が返るだけですね。
つまり、

1. team == :dortmund # もしteamが:dortmundだったらtrueが返る。falseだったら、2へ。
2. false || :milan   # :milanは論理演算子的にはtrueなので、:milanが返る。

こういう流れになっています。
これではいけません。

かといってこれもだめ

team == (:dortmund || :milan)

trueかfalseになりますが、
まず()の中の||の左辺が返り、
左辺とteamの評価が行われるだけ。

1. (:dortmund || :milan) # :dortmundが返る。:milanは絶対に返らない。
2. team == :dortmund   # 1の結果は:dortmundなので、こういう評価になる。

いけませんね。

論理演算子で書くならば、やはりこうしないといけないんですね。

team == :dortmund || team == :milan

これならば思っている通りに動いてくれそうです。

しかしダサいですね。僕はいつもこれを書くたびに吐きそうになっていました。
なんでteam == を2回も書かせるんだよ!条件式が長くなるだろって。
今もこの記事を書きながら吐きそうです。

そしてついに先ほど、見つけました。これを吐かずに書く方法を。

 こちらです!

%i(dortmund milan).include?(team)

これならば僕は満足、気分よく条件分岐をしてやれますよ。
たとえば :arsenal も条件に加えたくなったら、%i()の中に足せばいいだけ。

もし同じように吐きそうになっている方がいらっしゃいましたら幸いでございます。

Ruby最高!気持ちいい!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5