0
0

[Ruby] if文とcase文の使い分け

Posted at

社内勉強会で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の差があるのだろうか。調べてみたい。

0
0
0

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
0
0