クラスと正規表現を用いた case
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 38/56。
あなたは case を範囲と共に使用しました。同じ文はクラスや正規表現に対してもマッチします。これらはどちらも、when が内部で呼び出す === 演算子を介して行われます。
受け取った値の種類に基づいて分岐させるために、クラスでマッチングを行います:
def describe(value)
case value
when Integer then "a whole number"
when Float then "a decimal"
when String then "some text"
else "something else"
end
end
puts describe(42) # a whole number
puts describe(3.14) # a decimal
puts describe("hi") # some text正規表現と照合して、文字列の形状(電話番号、メールアドレス、日付など)に基づいて分岐させます:
def kind_of(text)
case text
when /^\d+$/ then "all digits"
when /@/ then "looks like an email"
when /^[A-Z]/ then "starts with a capital"
else "other"
end
endこれは、if/elsif 内での is_a? や match? の呼び出しを連鎖させるよりも、はるかにクリーンです。
チャレンジ
簡単入力を1行読み込みます。入力がどのように見えるかに基づいて、case文を使用して以下のラベルのいずれかを出力します:
- すべて数字の場合、
number @を含む場合:email- 大文字で始まる場合、
name - それ以外の場合、
unknown
リストされている順序でルールを確認してください(したがって、123はnumberであり、unknownではありません。kevin@coddy.techはemail、Aliceはnameになります)。
入力がkevin@coddy.techの場合、出力はemailです。
チートシート
Rubyのcase/whenは、内部で===を使用して、クラスや正規表現とのマッチングを行います。
クラスによるマッチング:
case value
when Integer then "a whole number"
when Float then "a decimal"
when String then "some text"
else "something else"
end正規表現によるマッチング:
case text
when /^\d+$/ then "all digits"
when /@/ then "looks like an email"
when /^[A-Z]/ then "starts with a capital"
else "other"
end自分で試してみよう
input = gets.chomp
# TODO: case input ... when /^\d+$/, /@/, /^[A-Z]/ ... else ... end
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。