• WebCamp_インタビュー
    「1カ月頑張ればこの先が見えてくる」地元メディアを立ち上げたママさん
    2017.07.20
  • WebCamp_インタビュー
    【卒業生インタビュー】台湾で月間100万UUの訪日旅行メディアを手掛けるCEOが、プログラミングを学んで得たものとは?
    2018.01.15
  • WebCampPro_インタビュー
    自分で稼ぐ力をつけるため、新卒5年目の営業マンがエンジニアに転職!【WebCampPro転職者インタビュー】
    2018.02.02
  • WebCamp_インタビュー
    【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!
    2018.01.15
  • WebCamp_インタビュー
    “未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー
    2017.10.04
  • WebCamp_インタビュー
    時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】
    2018.01.26
  • WebCampPro_インタビュー
    未経験から上京し、テレビでも話題のIT企業に転職!【WebCampPro卒業生インタビュー】
    2018.03.10
  • WebCampPro_インタビュー
    未経験でも寿司職人からWebデザイナーになった!ホスピタリティでスクールを支える宮脇トレーナー
    2017.05.26
  • WebCamp_インタビュー
    【WebCamp受講生インタビュー】起業準備中にCEOが気がついたプログラミングスキルの重要性とは?
    2017.12.25
  • WebCamp_インタビュー
    「自信の持てるスキルを得たい!」内定辞退した女子大生がプログラミングを学習したワケ。
    2018.04.28
  • WebCampPro_インタビュー
    未経験31歳からエンジニア転職を実現【実際に聞いてみた】
    2017.04.01

▼当サイトで人気のプログラミング教室のおすすめランキングはこちら!
プログラミングは独学では非効率で、時間を無駄にするリスクがあります。効率的なカリキュラムで学べるスクールを受講しましょう。

金王冠Web Camp【業界最安値】1ヶ月集中してプログラミングスキルを身につけられるスクール
1ヶ月通い放題・メンター常駐の教室環境でWebサービス等作りたい方
TechAcademyオンラインで開講しているプログラミングスクール
オンラインでどこでも学べる!/教室に行くのが忙しい人でも安心!
銅王冠Tech Camp業界最大級!教養としてのITスキルを学べるスクール
Webデザイン/AI(人工知能)/IOS/Androidアプリ制作/VRを学びたい方!
びっくりマークWebCampPro転職保証付き!エンジニアとして転職したい人におすすめ!
未経験からプロのエンジニアを3ヶ月で目指すプログラミングスクールです。
7月枠も残りわずか当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のWebCamp Proコース。
6月受入枠は満員となっております。7月枠に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい
上記にあてはまる方は、ぜひご検討ください!
※プログラミングを学んでみたいけど、時間がなくて全文の記事が読めない!という方は、WebCampの無料説明会(毎日開催)に参加してみてください!

 

Rubyの条件分岐、caseとは?

プログラムというのは、処理の流れを言葉にする作業といっても間違いではありません。
(Rubyはオブジェクト指向言語ですので、違うという人もいるかもしれませんが、処理手順を記述するのは、どんなプログラム言語でも同じです)

そのため、処理を分岐する(流れを変える)部分というのは、とても大事な点になります。

ここでは、そんな分岐処理の1つ、「case when」について、詳しく説明します。

始めて聞いた人も、知っているけどあまり使わない(使えない)人も、目から鱗が落ちますので、ぜひお読みください。

Rubyの条件分岐

多くの人が知っている分岐の記述は「if」ではないでしょうか?

ifはほぼすべての言語に存在する分岐処理で、ほぼどんな分岐でも表現できる優れたものですので、仕方がありません。

しかし、汎用的なものというのは、どうしても煩雑な記載になりがちで、「もっとシンプルに書けないものか?」と悩む人も少なくありません。

そこで、まずはRubyで扱える条件分岐について、簡単に紹介します。

“未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー
2017-10-04 10:26
今回の記事では、未経験からWebCampを1ヶ月受講し、その後エンジニアとして転職をした喜田さんにお話を伺いました。 <プロフィール> 喜田 大介 さん (28歳) 大学時代はプ...

if、unless

条件分岐のメジャーどころ「if」は、ほぼどんな条件でも表現できる万能選手です。

ただ、じつは複数条件の組み合わせを得意としているのは、それほど知られていないかもしれません。

「unless」は、Ruby独特の分岐かもしれませんが、ifの反対条件(条件を満たさなければ)で活躍します。

単一条件はcase

今回紹介する「case」は、ある1つの条件によって処理を分岐するのに最適なものです。

用途は限られてしまいますが、ifよりもシンプルに読みやすく書くことができますので、ぜひ使ってみてください。

その他

他にも、以下のような分岐処理はありますが、使いすぎるとプログラムの読みやすさを阻害することもありますので、気を付けましょう。

条件演算子(三項演算子 )

a = 条件 ? 真のときの値 : 偽のときの値

条件が成立したら真のときの値、そうでなければ偽のときの値を返す演算子です。

条件によって処理の流れを変えるのではなく、値を変更したい場合に活用すると、プログラムがすっきりするでしょう。

if修飾子、unless修飾子

真のときに実行する処理 if 条件
偽のときに実行する処理 unless 条件

条件が真のときにのみ(偽のときのみ)、処理を実行することができる式です。

条件によって特定の処理を実行するかどうか、というシンプルな分岐に使えば、こちらもプログラムコードをすっきりすることができます。

caseを使いこなそう

では、本題の「case」について、詳しく解説していきましょう。

「case」はあまりメジャーではなく、「if」と違ってほぼ必ず使うようなことがありませんので、使ったことがない人もいるかもしれません。

先に紹介した他の分岐処理も踏まえたうえで、「case」の構文や使うべきところの紹介もしますので、しっかりと学習していきましょう。

caseの使いどころ

条件分岐の1つであるcaseは、もちろんプログラムの流れを変えるところで使用します。

しかし、何度も書いているように、ifのように柔軟性のあるものではなく、「使いどころ」というものがあります。

ここでは、そんな「使いどころ」について詳しく説明しましょう。

caseを使うもっとも基本的なシーンは、「ある値に合わせて処理を分ける」ときです。

つまり、処理を分けるための基準が「値ごと」の場合にcaseを使うと、シンプルに読みやすいプログラムコードにすることができるわけです。

プログラムを見てみる

簡単な例を挙げると、自動販売機が分かりやすいかもしれません。

自動販売機は、ボタンを押して商品を購入できるといったものですが、押されるボタンによって、商品と金額が違っています。

つまり「ボタンの種類によって、商品と金額が決まる」ものです。

押されたボタンが条件で、分ける処理が商品と金額というわけですね。

まずは、ifで作成した場合のRubyのプログラムコードを紹介しましょう。

btn = 2  # 押されたボタンの種類(ボタン2が押されたとする)

if btn == 0 then
  price = 110
  item = "ミネラルウォーター"
elsif btn == 1 then
  price = 130
  item = "炭酸飲料"
elsif btn == 2 then
  price = 130
  item = "コーヒー"
elsif btn == 3 then
  price = 130
  item = "栄養ドリンク"
else
  price = 9999999999
  item = "無効な商品です"
end

# 上で、選択されたpriceとitemを使った処理(例えば、表示)
print(item, "を選択しました。\n")
print(price, "円になります。\n")

商品が4種類しかありませんが、ifで作るとこんな処理になると思います。

このプログラムも読みにくいわけではありませんが、複数条件や範囲条件に強いifで表現するのは、少し冗長だと考える人もいるかもしれません。

では、このプログラムコードを、caseを使ったものに修正してみましょう。

btn = 2  # 押されたボタンの種類(ボタン2が押されたとする)

case btn
when 0 then
  price = 110
  item = "ミネラルウォーター"
when 1 then
  price = 130
  item = "炭酸飲料"
when 2 then
  price = 130
  item = "コーヒー"
when 3 then
  price = 130
  item = "栄養ドリンク"
else
  price = 9999999999
  item = "無効な商品です"
end

# 上で、選択されたpriceとitemを使った処理(例えば、表示)
print(item, "を選択しました。\n")
print(price, "円になります。\n")

いかがでしょうか?

すっきり見やすくなったかと思います。

コツコツ独学×スクールで実践。未経験からエンジニアに転職!【WebCamp卒業生インタビュー】
2018-03-22 23:28
今回の記事では、独学でPHPを1年半学習し、その後WebCampを受講して未経験からエンジニアへと転職された佐々木さんにお話を伺いました。 <プロフィール> 佐々木 祐樹 さん(2...

caseは便利

見た目がすっきりとして読みやすいという点は、人によるところもあります。

ただし、実作業として利点がなければ、ただの自己満足です。

caseの実作業としての利点はまさに「見やすさ」と「パフォーマンス」にあるのです。

見やすさは重要

caseの見やすさというのは、条件が複数になったときにより発揮されます。

先ほどの自動販売機のプログラムで、仮にボタン1のミネラルウォーターがコーヒーになった場合、ifとcaseのそれぞれについて、どうなるかを見てみれば一目瞭然です。

・ifの場合

elsif btn == 0 or btn == 2 then
  price = 130
  item = "コーヒー"

 

・caseの場合

when 0, 2 then
  price = 130
  item = "コーヒー"

ifもcaseも、2つのブロックをまとめているという意味では同じですが、条件の記載が明らかに違っています。

これがもし、2つをまとめるのではなく、4つや5つまとめるとなると、ifは正攻法ではとても見にくいものになってしまうでしょう。

Rubyだけではありませんが、プログラムというのは、既存の処理を再利用するのが開発期間を短くするための常とう手段です。

しかしながら、過去の遺産をそのまま使えるということは、そう多くありません。そのため、過去に誰かが作ったプログラムコードを解析して、改造を加えることは往々にしてあります。(それは、企業での開発だけではなく、個人でプログラムを作っている人にも当てはまることです。趣味であっても同様です)

それに、数年後に不具合が見つかることもあります。そのときに作った人間以外がプログラムを解析するのはよくあることです。

そのため、プログラムを「できる限り見やすくする」というのは、重要なことなのです。(特に企業であればチームで開発するのが当然ですから、より重要になるでしょう)

そのため、「すっきり見やすい」というのは、プログラムそのものというよりは開発作業を進めるうえで重要なポイントといえるものなのです。

速度は重要

パフォーマンスは、よりプログラム単体の問題に近いポイントです。

例えば、Rubyであれば、サーバー上で動くWebアプリやスクリプトなどは、プログラムの処理速度がそのままサイトの操作性に直結します。つまり、少しでもパフォーマンスを上げることは、ユーザーや顧客の要求になることでしょう。

じつは、if分よりもcase分のほうが、処理速度が速いことが分かっていますので、上記のような処理速度やレスポンスにシビアなプログラムでは、caseのほうが適しているのです。

もちろん、1回の分岐に体感できるような速度の違いはありません。しかし、Webサイトなどでは一気に数万回も行わなければいけないようなことは当然ありますので、そうなるとレスポンスの違いが顕著に表れてくるのです。

具体的に、以下の繰り返し処理を使って計測してみました。(Time.nowは、今の時間を取得しています。また、10000.time do〜endは、〜を10000回繰り返す処理です)

btn = 2  # 押されたボタンの種類(ボタン2が押されたとする)

start = Time.now
10000.times do
  if btn == 0 then
    price = 110
    item = "ミネラルウォーター"
  elsif btn == 1 then
    price = 130
    item = "炭酸飲料"
  elsif btn == 2 then
    price = 130
    item = "コーヒー"
  elsif btn == 3 then
    price = 130
    item = "栄養ドリンク"
  else
    price = 9999999999
    item = "無効な商品です"
  end
end
itime = Time.now - start
  
start = Time.now
10000.times do
case btn
  when 0 then
    price = 110
    item = "ミネラルウォーター"
  when 1 then
    price = 130
    item = "炭酸飲料"
  when 2 then
    price = 130
    item = "コーヒー"
  when 3 then
    price = 130
    item = "栄養ドリンク"
  else
    price = 9999999999
    item = "無効な商品です"
  end
end
ctime = Time.now - start
  
print("if   time :",itime, "\n")
print("case time :",ctime, "\n")

結果は以下のようになります。

if   time :0.027582005
case time :0.016365465

マシンスペック等の条件で同じ時間になることはないと思いますが、実際に動かして確認してみると、caseのほうが速いと分かります。

時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】
2018-01-26 13:03
今回の記事では、WebCampに1ヶ月間通い、未経験からエンジニアとして転職した星野さんにお話を伺いました。 <プロフィール> 星野 智洋 さん(25) 学生時代は日本大学芸術学部...

caseのデメリット

見やすく書けてスピードが速いcaseですが、当然ながらあまり得意ではないシーンもありますので、その点もきちんと押さえて利用しなければいけません。

2択や3択程度は逆効果

caseのメリットはプログラムコードをすっきり書けることがもっと大きいです。

そのため、2択や3択程度の分岐であれば、あまり使う意味はないでしょう。

条件とする変数が複数ある場合

条件となる変数などが複数ある場合、caseで分岐するのは素直ではないでしょう。

その場合は、ifを使うほうが自然です。

もう少し詳しく

caseを使うに当たって、もう少し詳しい話をしておきます。

ここから先のcaseの理解を深めて応用できれば、caseを使いこなしているといっても大げさではありません。

thenは省略

caseを使ったプログラムは、thenを省略することで、もっとすっきりさせることができます。

btn = 2  # 押されたボタンの種類(ボタン2が押されたとする)

case btn
when 0
  price = 110
  item = "ミネラルウォーター"
when 1
  price = 130
  item = "炭酸飲料"
when 2
  price = 130
  item = "コーヒー"
when 3
  price = 130
  item = "栄養ドリンク"
else
  price = 9999999999
  item = "無効な商品です"
end

# 上で、選択されたpriceとitemを使った処理(例えば、表示)
print(item, "を選択しました。\n")
print(price, "円になります。\n")

より、条件が分かりやすくなりましたね。

範囲も扱えます

最初に、caseは「値ごと」の分岐に適していると書きました。

しかし、じつは一定の範囲での分岐も可能なのです。

例えば、自答販売機がミネラルウォーターしか扱わなくなったとすると、以下のようにできます。

btn = 2  # 押されたボタンの種類(ボタン2が押されたとする)

case btn
when 0..3
  price = 110
  item = "ミネラルウォーター"
else
  price = 9999999999
  item = "無効な商品です"
end

# 上で、選択されたpriceとitemを使った処理(例えば、表示)
print(item, "を選択しました。\n")
print(price, "円になります。\n")

「0..3」というのが、範囲を表しており、この範囲に該当するかどうかを、caseが判断してくれます。

条件を別にまとめる

条件をcaseの外にまとめておくことで、より変更に強いプログラムコードにすることができます。

自動販売機の例であれば、飲料の位置をずらした場合、コードの中のすべての条件を書き換える必要があり、ミスや変更漏れのリスクがあります。データとしてまとめてあれば、プログラムコードをいじる必要がありませんので、余計なミスを防ぐことができるでしょう。

※この対応には、配列の知識が必要です。まだ配列を把握していない人は「そういうものがある」という程度で大丈夫です。

btn = 2  # 押されたボタンの種類(ボタン2が押されたとする)

water, cider, coffee, genki = [0, 1, 2, 3]

case btn
when *water
  price = 110
  item = "ミネラルウォーター"
when *cider
  price = 130
  item = "炭酸飲料"
when *coffee
  price = 130
  item = "コーヒー"
when *genki
  price = 130
  item = "栄養ドリンク"
else
  price = 9999999999
  item = "無効な商品です"
end

# 上で、選択されたpriceとitemを使った処理(例えば、表示)
print(item, "を選択しました。\n")
print(price, "円になります。\n")

caseは式です

ifもそうですが、Rubyのcaseは文ではなく式です。そのため、条件による分岐結果を返してくれます。

btn = 2  # 押されたボタンの種類(ボタン2が押されたとする)

water, cider, coffee, genki = [0, 1, 2, 3]

price, item = 
case btn
when *water
  [110, "ミネラルウォーター"]
when *cider
  [130, "炭酸飲料"]
when *coffee
  [130, "コーヒー"]
when *genki
  [130, "栄養ドリンク"]
else
  [9999999999, "無効な商品です"]
end

# 上で、選択されたpriceとitemを使った処理(例えば、表示)
print(item, "を選択しました。\n")
print(price, "円になります。\n")

このように代入することで、より見やすくできるますが、いっそうシンプルにできます。

条件分岐を1行で

最初にthenを省略しましたが、それは改行にthenの代わりをさせているということです。

thenの代わりに「;(セミコロン)」を使うこともできます。

btn = 2  # 押されたボタンの種類(ボタン2が押されたとする)

water, cider, coffee, genki = [0, 1, 2, 3]
price, item = 
case btn
when *water;  [110, "ミネラルウォーター"]
when *cider;  [130, "炭酸飲料"]
when *coffee; [130, "コーヒー"]
when *genki;  [130, "栄養ドリンク"]
else          [9999999999, "無効な商品です"]
end

# 上で、選択されたpriceとitemを使った処理(例えば、表示)
print(item, "を選択しました。\n")
print(price, "円になります。\n")

ここまでするのはやりすぎかもしれませんが、こういったプログラムコードを見ることもあるかもしれませんので、知っておくことは重要です。

まとめ

Rubyのcaseについて、説明しました。

少し詳しすぎたかもしれませんが、処理を制御する基本的な部分ですので、Rubyらしいプログラムを作るためにも、ある程度知っておいたほうが良いと考えたため、敢えて踏み込みました。

ぜひ、caseをマスターしてRubyの醍醐味を味わってください。

・Rubyのcaseは、基本的に「値ごと」の分岐に使える
・Rubyのcaseは、ifよりも速い
・Rubyのcaseは、ifよりもプログラムをすっきり書ける場合がある
・Rubyのcaseのもっとも大きな利点は、プログラムを読みやすくすること

WebCamp・WebCamp Proについて

WebCampは1ヶ月でプログラミング・Webデザインスキルを学ぶ通い放題のプログラミングスクールです。WebCamp Proは3ヶ月間で未経験から即戦力エンジニアを育成するプログラミングスクールです。

2つのサービスを運営するインフラトップでは、「学びと仕事を通して人生を最高の物語にする」という理念で会社を経営しています。

キャリアアップを目指す方は、この機会に私達と一緒にプログラミングを学んでみませんか?

7月枠も残りわずか当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のWebCamp Proコース。
6月受入枠は満員となっております。7月枠に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい
上記にあてはまる方は、ぜひご検討ください!

▼未経験から1ヶ月でWebデザイン・プログラミングを学びたい方はこちら!

▼ついに開講!オンラインでWebデザインを学びたい方はこちら!

 

【インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

ブラジルから帰国し技術をつけようとRubyエンジニアを目指してWebCampでRubyを学び、見事Webエンジニアとして転職を果たした田中さんにお話を伺いました。

Rubyの学習がしたい。基礎をしっかりと理解したい

転職のサポートがほしい

と考えている方はぜひお読み下さい。

【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!
2018-01-15 13:23
今回の記事では、WebCampで1ヶ月間Rubyを学習し、Webエンジニアとして転職した卒業生の田中さんにお話を伺いました。 <プロフィール> 田中 デニス 昭彦さん(...
関連キーワード
Rubyの関連記事
  • 【Ruby 入門者説明書!】ifを使いこなすポイントはここ!解説
  • 【Ruby入門説明書】ruby caseについて解説
  • 【Ruby入門説明書】オブジェクトの理解について解説
  • 【Ruby入門説明書】変数と定数について解説
  • 【Ruby入門説明書】数値と四則計算について解説
  • 【Ruby入門説明書】日本語と文字列、コードについて解説

当サイトで人気のオススメ転職サービスTOP3

1位 マイナビエージェント×IT

おすすめポイント

・平日忙しい人も、土曜日開催の個別キャリア相談会に参加できる

・職種や仕事内容(要件定義、上流工程から携わる仕事など)の要望が細かくできる
・マイナビの規模を活かした豊富で幅広い求人数

マイナビエージェント×ITの登録はこちら

2位 レバテックキャリア

おすすめポイント

・求人登録数4,000件以上

・エンジニア未経験、経験者両方に対応

・有名企業の採用担当者インタビューがみれる

・一次面接NGからの内定実績もあるほど、内定率が高い

レバテックキャリアの登録はこちら

 3位 type転職エージェント

おすすめポイント

転職者の71%が年収アップ

・IT系企業、特にエンジニアに限らず営業職の求人も充実している

各職種専門の転職アドバイザーが援助

type転職エージェントの登録はこちら

おすすめの記事