実践的なユースケース
構造化データを解析します。
「実践的なユースケース」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。
パターンマッチングの強み
パターンマッチングは、APIレスポンス、設定ツリー、パースしたファイルなどの構造化データを扱うときに最も力を発揮します。入れ子になったif/digによるチェックを、読みやすい1つの式に置き換えられます。
require 'json'
resp = JSON.parse('{"ok":true,"data":42}', symbolize_names: true)
case resp
in { ok: true, data: }
puts(data)
endAPIの成功とエラーの処理
異なるレスポンスの形状を別々の分岐でマッチさせ、それぞれに必要なフィールドを取り出せます。
def handle(resp)
case resp
in { status: 'ok', result: }
"got #{result}"
in { status: 'error', message: }
"error: #{message}"
end
end
puts(handle({ status: 'error', message: 'bad input' }))コマンド引数のパース
引数の配列をマッチさせると、コマンドをすっきり振り分けられます。
def run(args)
case args
in ['add', a, b]
a.to_i + b.to_i
in ['echo', *rest]
rest.join(' ')
end
end
puts(run(['add', '3', '4']))
puts(run(['echo', 'hi', 'there']))レコードの形状の検証
パターンを使用して、処理する前にレコードが必要なフィールドと型を持つことを検証できます。
def valid?(rec)
case rec
in { name: String, age: Integer => a } if a >= 0
true
else
false
end
end
puts(valid?({ name: 'Ada', age: 36 }))
puts(valid?({ name: 'X', age: -1 }))入れ子になった設定の分解
連続した参照を使う代わりに、1回のマッチングで深い場所にある設定値を取り出せます。
cfg = { server: { host: 'localhost', port: 8081 } }
case cfg
in { server: { host:, port: } }
puts("#{host}:#{port}")
endタグ付きユニオン
関数型プログラミングでよく使われるパターンです。型でタグ付けされたデータを、そのタグに応じて振り分けます。
def area(shape)
case shape
in { type: 'circle', r: }
(3.14 * r * r).round(2)
in { type: 'rect', w:, h: }
w * h
end
end
puts(area({ type: 'rect', w: 3, h: 4 }))deconstructによるマッチング
カスタムオブジェクトでdeconstructを定義すると、マッチングできるようになります(配列パターン用)。Structはこれを自動的に行います。
Point = Struct.new(:x, :y)
case Point.new(1, 2)
in [x, y]
puts("#{x},#{y}")
enddeconstruct_keysによるマッチング
ハッシュパターンに対応するにはdeconstruct_keysを定義します。Structにもこの機能があり、名前付きマッチングを可能にします。
Point = Struct.new(:x, :y)
case Point.new(3, 4)
in { x:, y: }
puts("x=#{x} y=#{y}")
endクラスとパターンのマッチング
型パターンとハッシュパターンを組み合わせると、特定のクラスとそのフィールドにマッチさせられます。
User = Struct.new(:name, :admin, keyword_init: true)
case User.new(name: 'Ada', admin: true)
in User(admin: true, name:)
puts("#{name} is an admin")
end安全なフォールバック
入力がマッチしない可能性がある場合は、必ずelseを指定してください。例外を適切な処理に切り替えられます。
def parse(data)
case data
in { id: Integer => id }
"id #{id}"
else
'unrecognized'
end
end
puts(parse({ name: 'x' }))すべてを組み合わせる
現実的な流れでは、JSONをパースし、その形状をマッチさせ、ガードで検証してから処理します。これらをすべて、整理された1つの式で実行できます。
require 'json'
event = JSON.parse('{"kind":"purchase","amount":150}', symbolize_names: true)
case event
in { kind: 'purchase', amount: Integer => amt } if amt > 100
puts("big purchase: #{amt}")
in { kind: 'purchase', amount: }
puts("purchase: #{amount}")
end確認問題
in { x:, y: }のようなハッシュパターンマッチングに対応するには、カスタムクラスでどのメソッドを定義する必要がありますか。
まとめ:実践的なユースケース
実際の問題にパターンマッチングを適用しました。
- APIレスポンスとコマンドの振り分け
- ガードによるレコードの形状の検証
- 入れ子になった設定とタグ付きユニオンの分解
- カスタムオブジェクト用の
deconstruct/deconstruct_keys - 安全なフォールバックのための
elseの追加
Rubyパターンマッチングコースを修了しました。
case { type: 'circle', r: 2 }
in { type: 'circle', r: } then puts(3.14 * r * r)
endAI チューターと学ぶ Ruby — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 29
- レッスン
- 109
よくある質問
「実践的なユースケース」レッスンは無料ですか?
はい。「実践的なユースケース」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。
「実践的なユースケース」で何を学びますか?
構造化データを解析します。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Ruby Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「実践的なユースケース」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このRuby Academyレッスンでコードを書いて実行できますか?
はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- case/in の基礎
- 配列とハッシュのパターン
- Find パターンとガード
- 実践的なユースケース