case を使うと、プログラムの処理を条件分岐させることができます。
以下から Rubyでの「case・when」の使い方を解説していきます。
目次
case の基本
「case」を使うと、「比較対象の値が○○に当てはまったら、××の処理を行う」といった制御ができます。以下のようにして、複数の条件と処理を指定するのが基本です。
case 比較対象
when 比較する値1
比較対象が比較する値1に当てはまった場合の処理
when 比較する値2
比較対象が比較する値2に当てはまった場合の処理
else
どれにも当てはまらなかった場合の処理
end
case を使ったプログラム例
実際にプログラムを書いて動作を確認してみましょう。
数値を条件にする
以下は「a」の変数に入っている数値によって出力される表示を変える例。
a = 1
case a
when 1
p "a は 1 である"
when 2
p "a は 2 である"
else
p "条件に一致しない"
end
"a は 1 である"
1行目で、「a」の変数に 2
をセットして確認してみると、結果が変わることが確認できます。
a = 2
case a
when 1
p "a は 1 である"
when 2
p "a は 2 である"
else
p "条件に一致しない"
end
"a は 2 である"
今度は1行目で、「a」の変数に 3
をセットして確認してみると、どの条件にも一致しないため、何も表示されません。
a = 3
case a
when 1
p "a は 1 である"
when 2
p "a は 2 である"
else
p "条件に一致しない"
end
"条件に一致しない"
文字列を条件にする
以下は「a」の変数に入っている文字列によって出力される表示を変える例。
a = "grape"
case a
when "orange"
p "a は orange である"
when "grape"
p "a は grape である"
else
p "条件に一致しない"
end
"a は grape である"
複数の値を条件に入れる
カンマ(,)で区切ることで、複数の値を条件に入れることができます。
a = 1
case a
when 1, 2, 3
p "a は 1〜3 である"
when 4, 5, 6
p "a は 4〜6 である"
else
p "条件に一致しない"
end
"a は 1〜3 である"
数値の範囲で条件を指定する
..
を使うことで、数値の範囲で条件を指定することができます。
a = 5
case a
when 1..3
p "a は 1〜3 である"
when 4..6
p "a は 4〜6 である"
else
p "条件に一致しない"
end
"a は 4〜6 である"
配列を使って条件を指定する
配列の前にアスタリスク(*
)をつけると、配列を使った条件指定ができます。比較対象の値が、条件で指定した配列のいずれかの要素に一致したら、それに対応した処理を行います。
a = "apple"
array1 = ["orange", "grape", "banana"]
array2 = ["melon", "apple"]
case a
when *array1
p "a は orange または grape または banana である"
when *array2
p "a は melon または apple である"
else
p "条件に一致しない"
end
"a は melon または apple である"
配列について詳しくはこちら。
正規表現を使って条件を指定する
スラッシュ(/
)で囲むことで、正規表現を使って条件を指定することができます。
a = "apple"
case a
when /^[a-z]+$/
p "a は小文字である"
when /^[A-Z]+$/
p "a は大文字である"
else
p "条件に一致しない"
end
"a は小文字である"
正規表現について詳しくはこちら(作成中)。
条件でクラスを指定する
条件でクラスを指定することもできます。
a = 'abc'
case a
when Integer
p "a は数値である"
when Float
puts "a は小数である"
when String
puts "a は文字列である"
else
puts "条件に一致しない"
end
"a は文字列である"
応用・case を if で表した場合
理解を深めるための余談になりますが、case の構文は if を使って表すこともできます。
以下の2つのプログラムは同じ動作になります。
a = 1
case a
when 1
p "a は 1 である"
when 2
p "a は 2 である"
else
p "条件に一致しない"
end
a = 1
if a === 1
p "a は 1 である"
elsif a === 2
p "a は 2 である"
else
p "条件に一致しない"
end
===
は、数値や文字列が等しいか、範囲にあるかどうか、正規表現に一致するかなどを比較対象に合わせて判定してくれるメソッドです。case を使った場合、内部では ===
で処理されていることによって柔軟な条件で比較できるというわけです。
if でも表すことができますが、特定のオブジェクトが条件に一致しているかどうかを調べて条件分岐させたい場合は、case のほうがよりシンプルに記述できるかと思います。
まとめ
以上、Rubyでの「case・when」の使い方でした!
ここまでの内容をまとめておきます。
- 「case」を使うと、「比較対象の値が○○に当てはまったら、××の処理を行う」といった制御ができる。
- 数値や文字列の比較のほか、ひとつの条件に複数の値を指定したり、数値を範囲で指定したり、配列を使った指定、正規表現・クラスでの比較も行うことができる。