Menu
Coddy logo textTech

クラスと正規表現を用いた 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? の呼び出しを連鎖させるよりも、はるかにクリーンです。

challenge icon

チャレンジ

簡単

入力を1行読み込みます。入力がどのように見えるかに基づいて、case文を使用して以下のラベルのいずれかを出力します:

  • すべて数字の場合、number
  • @を含む場合:email
  • 大文字で始まる場合、name
  • それ以外の場合、unknown

リストされている順序でルールを確認してください(したがって、123numberであり、unknownではありません。kevin@coddy.techemailAlicenameになります)。

入力が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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン