Case / WhenにおけるRange
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 8/56。
Rubyのcase文の中では、範囲(Range)が本領を発揮します。多くの言語では比較演算子を用いたif/elsifの連鎖が必要な場面でも、Rubyでは値を範囲に対して直接マッチさせることができます。
score = 78
grade = case score
when 90..100 then "A"
when 80..89 then "B"
when 70..79 then "C"
when 60..69 then "D"
else "F"
end
puts grade # C内部的には、when 70..79 は範囲の === 演算子を使用しており、これは (70..79).include?(score) と同等です。
case形式は、長いif/elsifの連なりよりも短く、読みやすく、そして素早く書くことができます。
チャレンジ
簡単カンマ区切りの整数の年齢リストを読み込みます。各年齢について、範囲(ranges)を使用した case 文を使って分類します:
0..12:Child13..19:Teen20..64:Adult65以上:Senior- その他(負の数): スキップされ、レポートには含まれません
ゼロではない各カテゴリについて、Child、Teen、Adult、Senior の固定順でカウント行を出力します。人数がゼロのカテゴリはスキップしてください。カウントの後に、Skipped: <n> を出力します。ここで n は負の(無効な)年齢の数です。
入力が 5,15,30,70,-3,40,12 の場合、出力は次のようになります:
Child: 2
Teen: 1
Adult: 2
Senior: 1
Skipped: 1チートシート
case 文で範囲(range)を使用します。Rubyは === (include? と同等)を使用してマッチングを行います:
score = 78
grade = case score
when 90..100 then "A"
when 80..89 then "B"
when 70..79 then "C"
when 60..69 then "D"
else "F"
end
puts grade # C自分で試してみよう
ages = gets.chomp.split(",").map(&:to_i)
# TODO: caseと範囲を使って各年齢を分類し、カテゴリごとに集計してレポートを出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。