社内勉強会でcase文の中でfindパターンができた話を聞いていたら、if文とcase文ってなんで別々に存在するのだろう、という疑問が湧いた。
なんとなく分岐が多い時に可読性をあげたりすることができるのかなと思っていたが、caseの優れたところがあったため、まとめてみた。
===
演算子の活用
そもそもRubyって===
演算子があるの?というところから始まった。JavaScriptだとよく見かけるのだが...以下ブログがすごくわかりやすかった。
要するにゆるい==
で、サブクラスの所属まで検知してくれるとのこと。
なので、オブジェクトや..
を使った範囲内のものに属するかを検知することができる。
以下がその例である。
1. 数値の範囲
age = 25
case age
when 0..12
puts "子供"
when 13..19
puts "10代"
when 20..64
puts "大人"
else
puts "シニア"
end
2. 正規表現
email = "user@example.com"
case email
when /^[a-z0-9]+@gmail\.com$/
puts "Gmailアドレス"
when /^[a-z0-9]+@yahoo\.com$/
puts "Yahooアドレス"
else
puts "その他のメールアドレス"
end
3. クラスの比較
obj = [1, 2, 3]
case obj
when String
puts "文字列です"
when Array
puts "配列です"
when Hash
puts "ハッシュです"
else
puts "その他のオブジェクトです"
end
4. Procオブジェクト
is_even = proc { |n| n.even? }
number = 4
case number
when is_even
puts "偶数です"
else
puts "奇数です"
end
# 同等のif文
if is_even.call(number)
puts "偶数です"
else
puts "奇数です"
end
他にも違いが
- 構文の簡潔さ: case文は複数の条件を比較する際に、if-elsif-else構造よりも簡潔に書くことができる
- 値の代入: case文では、whenの条件に合致した場合の値を直接代入できる
- パフォーマンス: 多くの条件分岐がある場合、case文の方がif-elsif構造よりもちょっとだけ早いことがある
おわりに
そういえばJSではifとswitchの差があるのだろうか。調べてみたい。