Rubyのcase文とRangeが相性抜群!得点判定や料金計算の実践レシピ
生徒
「if文を使って『もし点数が80点以上ならA評価、70点以上ならB評価…』と書くと、コードが長くなって見にくい気がします。」
先生
「その通りですね。条件が多くなる時は『case文』を使うとスッキリ書けます。特に『Range(範囲)』と組み合わせると最強ですよ。」
生徒
「case文とRange…?なんだか難しそうですが、初心者でも使いこなせますか?」
先生
「もちろんです!自動販売機の料金計算やテストの採点など、身近な例で使い方をマスターしていきましょう!」
1. case文とは?分岐をスッキリ整理する魔法
Rubyのcase文は、一つの対象に対して「もしこれなら」「あるいはこれなら」と、いくつもの条件を整理して書くための道具です。プログラミング未経験の方にとって、多くのifやelseが並ぶコードは、まるで迷路のように見えてしまうことがあります。そんな時、case文を使えば「この値がどうなっているか」に注目して、分かりやすく処理を分けることができます。
例えば、信号機の色によって「進め」「止まれ」を変えるような処理はcase文が得意とする分野です。条件分岐の基本はif文ですが、選択肢が3つ以上あるような複雑な場面では、case文を使うのが「読みやすいプログラム」を書くための第一歩となります。まずは「たくさんの分かれ道を一本の柱にまとめるイメージ」を持ってください。
2. Range(範囲)を復習しよう:点々の意味
case文をさらに便利にするのがRange(範囲オブジェクト)です。これは「1から10まで」といったデータの塊を表現する仕組みです。Rubyではドット(点)を2つ使って 1..10 と書くことで、1、2、3…10という範囲を作ることができます。これをcase文の条件に使うことで、「点数が80点から100点の間なら」という条件を直感的に記述できるようになります。
パソコンを触ったことがない方でも、カレンダーの「1日から15日まで」という期間指定を想像してみてください。一つ一つの数字を全部書かなくても、最初と最後を指定するだけで範囲が決まるのは便利ですよね。このRangeを使いこなすと、プログラムの記述量が劇的に減り、ミスも少なくなります。
3. 実践レシピ1:テストの成績判定プログラム
それでは、具体的に「テストの点数」によって評価を分けるプログラムを見てみましょう。case文とRangeを組み合わせることで、驚くほどスッキリとしたコードになります。
score = 85
evaluation = case score
when 90..100
"大変優秀な成績です!"
when 70..89
"合格です、よく頑張りました。"
when 0..69
"もう少し復習が必要ですね。"
else
"正しい点数を入力してください。"
end
puts evaluation
このコードの実行結果は以下の通りです。
合格です、よく頑張りました。
when 70..89 という部分が、「もし点数が70から89の間なら」という範囲の条件になっています。else は、どの範囲にも当てはまらなかった場合(例えばマイナスの点数や101点など)の処理を受け持つ「その他」の受け皿です。
4. when節での複数条件とRangeの活用
case文の when(ウェン)の後には、複数の条件をカンマで区切って並べることもできます。例えば、「1、3、5」といった特定の数字と、「10から20まで」という範囲を同時に指定することも可能です。これにより、さらに柔軟なルール作りができるようになります。
専門用語で 「when節」 と呼びますが、これは「いつ、どのケースで処理を行うか」を定義する場所です。一つ一つの条件を独立させて書く必要がないため、似たような結果になる条件をひとまとめにできるのが大きなメリットです。初心者の方は、「whenは条件のラベルを貼る作業」だと考えると分かりやすいでしょう。
5. 実践レシピ2:年齢に応じた料金プラン判定
次に、映画館や遊園地などの「年齢別チケット料金」の判定をプログラムにしてみましょう。日常生活でもよく見かける仕組みですが、これもRangeを使うと非常にスマートに書けます。
age = 12
ticket_type = case age
when 0..5
"幼児(無料)"
when 6..12
"小学生(500円)"
when 13..18
"中高生(1,000円)"
when 19..64
"大人(1,800円)"
else
"シニア割引(1,200円)"
end
puts "あなたのチケットは #{ticket_type} です。"
このコードの実行結果は以下の通りです。
あなたのチケットは 小学生(500円) です。
このように、年齢層という「範囲」を扱うとき、case文は最高に相性が良いツールとなります。age という一つの変数(データの入れ物)をじっと見つめて、どのラベル(Range)に当てはまるかを探していくイメージですね。
6. include? メソッドとの裏側の関係
なぜcase文でRangeが使えるのでしょうか?実は、Rubyの内部では when にRangeが来ると、その範囲の中に値が含まれているかを自動的にチェックしてくれています。以前学んだ include? メソッドと同じようなことが、裏側でこっそり行われているのです。
初心者の方は、この難しい仕組みを覚える必要はありませんが、「Rubyが気を利かせて、範囲の中に数字があるか調べてくれているんだな」と理解しておくだけで十分です。このような「プログラマが書きやすいように設計された仕組み」を、専門用語で 「糖衣構文(シンタックスシュガー)」 と呼ぶこともあります。甘い砂糖のように、書きやすく、読みやすく工夫されているのですね。
7. 実践レシピ3:気温による服装アドバイス
今度は、天気予報アプリなどで使われそうな「気温に応じた服装アドバイス」を作ってみましょう。マイナスの気温(氷点下)なども想定した、少し複雑な範囲の例です。
temperature = 18
message = case temperature
when ..0
"非常に寒いです。厚手のコートを着ましょう。"
when 1..15
"肌寒いです。ジャケットが必要です。"
when 16..25
"過ごしやすい陽気です。長袖のシャツがおすすめ。"
else
"暑いです。半袖で出かけましょう。"
end
puts "今日の気温は#{temperature}度です。#{message}"
このコードの実行結果は以下の通りです。
今日の気温は18度です。過ごしやすい陽気です。長袖のシャツがおすすめ。
ここで注目してほしいのは ..0 という書き方です。これは「0以下すべて」という非常に広い範囲を表します。最新のRubyではこのように「始まり」や「終わり」を省略したRangeも書けるようになっており、条件分岐がさらに強力になっています。どんな極寒の地でも対応できるプログラムになりました!
8. elseを忘れない!エラーを防ぐ設計ルール
case文を書くとき、最も大切なルールは 「どれにも当てはまらない時の処理(else)」を必ず書くこと です。プログラムは時に、私たちが予想もしなかった値を扱うことがあります。例えば、点数の計算でバグが起きて、点数が「文字」になってしまったり、想定外の大きな数字になったりした時、else がないとプログラムは何もせずに黙ってしまいます。
「その他すべて」を意味する else を用意しておくことで、プログラムが意図しない挙動をするのを防ぎ、エラーを早期に見つけることができます。これは「安全な設計」と呼ばれる、プロのプログラマも大切にしている基本中の基本です。初心者こそ、お守り代わりに else を添える習慣をつけましょう。
9. case文を使うときの注意点:順番に気をつけよう
最後に、case文とRangeを使う際の落とし穴について解説します。case文は、上から順番に条件をチェックしていき、最初に当てはまった場所で処理を終わらせる という性質を持っています。そのため、範囲が重なっている場合は、書く順番がとても重要になります。
num = 5
case num
when 1..10
puts "10以下の数字です"
when 1..5
puts "5以下の数字です"
end
実行結果は以下の通りです。
10以下の数字です
本当は「5以下」と言ってほしくても、上の 1..10 に先に当てはまってしまうため、下の処理は無視されます。このように、範囲を使う時は「より具体的な条件」や「狭い範囲」を先に書くようにするのが、迷わないための実践ルールです。この順番を意識するだけで、あなたのプログラムの精度は格段に上がりますよ!