論理演算子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最高!気持ちいい!