クラスと正規表現を用いた 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) # 整数
puts describe(3.14) # 小数
puts describe("hi") # テキスト正規表現に対してマッチングを行うことで、文字列の形状(電話番号、メールアドレス、日付など)に応じて条件分岐します。
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行の input を読み込みます。入力がどのように looks(見えるか)に基づいて、case 文を使用して次のラベルのいずれかを出力してください:
- すべての digits:
number @を含む:email- capital 文字で始まる:
name - その他すべて:
unknown
記載された順序でルールを確認してください(したがって 123 は unknown ではなく number、kevin@coddy.tech は email、Alice は name となります)。
入力 kevin@coddy.tech の場合、出力は email です。
自分で試してみよう
input = gets.chomp
# TODO: case input ... when /^\d+$/, /@/, /^[A-Z]/ ... else ... end
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ