Ruby Academy · レッスン

実践的なユースケース

構造化データを解析します。

レッスン 4/413 ステップ

「実践的なユースケース」は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)
end

APIの成功とエラーの処理

異なるレスポンスの形状を別々の分岐でマッチさせ、それぞれに必要なフィールドを取り出せます。

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}")
end

deconstruct_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)
end
無料で開始

AI チューターと学ぶ 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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. case/in の基礎
  2. 配列とハッシュのパターン
  3. Find パターンとガード
  4. 実践的なユースケース
← Ruby Academyに戻る