Wakotech Blog

ポエム

rubyで同一の変数に対して複数の対象と比較したい時の処理

プログラムを書いているとこのようなコードを書く場面にそこそこ出くわすと思います。

if hoge == :next || hoge == :end

このコードでは変数hogeは:nextか:endに一致するかを判定したいのですが、なんだか無駄な書き方な気がします。(DRYでない感じがします。)
2つならまだいいですが3つとなると少し厳しいです。

例えばcase文では複数要素を指定できるので、

case hoge
when :start
  # 処理
when :next, :end
  # 処理
end

とすることができます
ただし、:nextと:endのみにマッチすればよい(:startは必要無い)ときにcase文を使うのも気持ち悪いです。

caseを使わずDRYでもない書き方として、以下のように書くことにしました。

if [:next, :end].include?(hoge)

日本語の考え方だと難しいですが、英語的に見ればまあ納得な感じかと思います。
hoge.included?([:next, :end])の方がぱっとわかりやすいのですが。
他に簡潔な方法がなく読みにくいわけでもないのでこの書き方を使ってみようと思います。このようなことを書いている方が何人かいたのですが、有名な書き方ではないので悪しからず……。
近い未来にrubyにincluded?のようなものが実装されることを祈っています。