Rubyのcase式を使った条件分岐まとめ!複数条件や正規表現の書き方も解説


Rubyのcase式を使った条件分岐まとめ!複数条件や正規表現の書き方も解説

image

目次
  1. Rubyのcase式
  2. case式の基本
  3. 複数条件を指定する
  4. case式で正規表現を使う
  5. まとめ

Rubyのcase式

case式はある特定のオブジェクトの値が何かを調べる際に便利な条件分岐の式です。基本的には同じ条件分岐の構文であるif-elsif-else文に書き換えることが可能です。if文の理解が曖昧な方はRubyのif文 - 条件分岐の記事も合わせて参考にしましょう。

なお、Rubyにはswitch文がありません。Rubyにおけるcase式は、他のプログラミング言語におけるswitch文のようなものだと考えれば理解しやすいかと思います。(厳密にはswitch文とは少し違いますが、だいたい同じようなものだと考えて頂ければいいかと思います。)

case式の基本

case式の基本的な書式は下記になります。

case (オブジェクト)
when (値1) then
  (値1に合致した場合に実行する処理)
when (値2) then
  (値2に合致した場合に実行する処理)
when (値3) then
  (値3に合致した場合に実行する処理)
else
  (値1~3のいずれにも合致しなかった場合に実行する処理)
end

case式では、caseの後ろに判定の対象とするオブジェクトを記述します。whenの後ろには対象のオブジェクトが合致しているかどうかを調べる値を記述します。値が合致した場合には、then以降の処理が実行されます。thenについては省略することも可能です。また、whenの条件はいくつでも追加することができます。else句は全ての値に合致しなかった場合にのみ実行されますが、必要がない場合は記述しなくて大丈夫です。

では実際にコードを書いてみましょう。

case pet
when 'dog' then
  p '犬派です'
when 'cat' then
  p '猫派です'
else
  p '犬派でも猫派でもありません'
end

変数petの中には「dog」「cat」あるいはその他の文字列が入っています。もし仮にpetの中にdogという文字列が入っていた場合には、結果は「犬派です」と表示されます。catという文字列の場合は「猫派です」と表示され、それ以外の場合は「犬派でも猫派でもありません」と表示されます。

なお、最初に解説した通り、case式はif文に書き換えることができます。上記の例は下記のif文と全く同じ動作をします。

if pet === 'dog'
  p '犬派です'
elsif pet === 'cat'
  p '猫派です'
else
  p '犬派でも猫派でもありません'
end

ここで注目して頂きたいのが「===」という部分です。

「===」は、対象オブジェクトの型によって動きを変えるメソッドです(他言語を学習された方にとっては違和感かもしれませんが、Rubyにおいて「===」は演算子ではなくメソッドとなっています)。今回使った変数petは文字列オブジェクトであると考えられるので、「pet === 'dog'」は「pet == 'dog'」に変換され、同値判定が行われています。

ところで文字列オブジェクトの場合は「===」は「==」演算子となりますが、範囲オブジェクトの場合にはその範囲に含まれているかを判定するbetween?メソッド(include?メソッド)となり、正規表現オブジェクトの場合には正規表現に一致するかを判定する「=~」演算子となります。

この「===」メソッドの仕組みを利用することで、case式では複数条件を指定したり、正規表現を使うことが可能となっています。この2つについて、続けて見ていきましょう。

複数条件を指定する

先ほど記載した通り、case式では複数条件を指定することもできます。

case age
when 13, 14, 15 then
  '中学生'
when 16, 17, 18 then
  '高校生'
end

このcase式はageという変数で年齢(数字)を受け取り、受け取った変数の値に応じて中学生であるか高校生であるかを判定します。「13, 14, 15」というようなカンマ(,)で区切る書き方をすると、配列オブジェクトになります。複数条件を指定する場合、値に配列オブジェクトが使えるということです。

なお、配列オブジェクト以外にも範囲オブジェクトを値として利用することも可能です。

case year
when 1912..1925 then
  '大正'
when 1926..1989 then
  '昭和'
else
  '平成'
end

このcase式は、変数yearで西暦年を受け取り、その年の元号を返します。

case式で正規表現を使う

また、case式では判定する値に正規表現を用いることができます。

case pass
when /^[0-9]{4}$/ then
  p 'パスワードの入力を受け付けました'
else
  p 'パスワードは4文字の数字で入力してください'
end

このcase式では変数passに4桁の数字のみのパスワードが入っているとされ、passの中に本当に4桁の数字のみが入っているかを検証しています。このように入力された文字の妥当性を検証する処理をバリデーションと呼びます。

なお、正規表現についてもっと知りたい方は、下記の記事がおすすめです!

Rubyの正規表現の使い方をマスターしよう!match/gsub

まとめ

このようにcase式は変数の中身を様々な方法で判定することが可能で、非常に便利な式となっています。もし変数の値を調べるようなif文を書くことがあった場合には、case式で書けないか考えてみましょう!

image

CodeCampus編集部
この記事を書いた人
CodeCampus編集部
\無料体験開催中!/自分のペースで確実に習得!
オンライン・プログラミングレッスンNo.1のCodeCamp