Menu
Coddy logo textTech

パターンとマッチング (3.0)

CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 87/110。

Dart 3ではパターン matchingが導入されました。これは、1つの expression で data を destructuring し、検査するための強力な方法です。パターンを使うと、オブジェクトから値を取り出し、その構造を確認し、変数を束縛することを、すべて一度に行えます。

レコードを使った基本的なdestructuringはすでに見ました。パターンを使うと、これをオブジェクト、リスト、マップにも適用できます。

void main() {
  // リストパターン
  var numbers = [1, 2, 3];
  var [a, b, c] = numbers;
  print('$a, $b, $c');  // 1, 2, 3
  
  // マップパターン
  var user = {'name': 'Alice', 'age': 30};
  var {'name': name, 'age': age} = user;
  print('$name is $age');  // Alice is 30
}

パターンは特に switch 式で強力になります。型、値、構造を同時に照合できます。

String describe(Object obj) {
  return switch (obj) {
    int n when n < 0 => 'Negative number',
    int n => 'Positive number: $n',
    String s => 'String of length ${s.length}',
    [int first, ...] => 'List starting with $first',
    _ => 'Something else',
  };
}

void main() {
  print(describe(-5));        // 負の数
  print(describe(42));        // 正の数: 42
  print(describe([1, 2, 3])); // List starting with 1
}

when clause はパターンに条件を追加し、... は list 内の残りの elements に一致します。アンダースコア _ は、あらゆるものに一致するワイルドカードとして機能します。シールドクラスと組み合わせることで、パターンによって複雑なデータ構造を網羅的かつ型安全に扱えるようになります。

challenge icon

チャレンジ

簡単

パターンマッチングを使用してさまざまな種類の入力を分析・分類するデータ classifier を構築しましょう!Dart 3 の強力なパターンマッチング機能を使って、さまざまなデータ構造を識別し、説明できるシステムを作成します。

コードを 2 つのファイルに分けて整理します。

  • classifier.dart: Object パラメーターを受け取り、String の説明を返す classify function を作成します。パターンマッチングを使用する switch 式で、次のケースを処理してください。
    • 空の list []Empty list を返す
    • integer element が exactly 1 つの list は Single item: [value] を返す
    • elements が exactly 2 つの list は Pair: [first] and [second] を返す
    • integer で始まり、その後にさらに elements が続く list は List starting with [first], length: [total length] を返す(... rest pattern を使用)
    • 'name''age' の keys を both 含む map は [name] is [age] years old を返す(map pattern destructuring を使用)
    • 負の integer(when clause を使用)は Negative: [value] を返す
    • 0 である integer は Zero を返す
    • その他の integer は Positive: [value] を返す
    • その他の値は Unknown type を返す
  • main.dart: classifier を import し、さまざまな input でパターンマッチングを実演します。次の各値を classify した結果を出力してください。
    • 空の list []
    • 1 つの element を持つ list: [42]
    • 2 つの elements を持つ list: ['hello', 'world']
    • より長い list: [1, 2, 3, 4, 5]
    • map: {'name': 'Alice', 'age': 25}
    • integer -10
    • integer 0
    • integer 99

この challenge では、list patterns、map patterns、guard 用の when clause、そして rest pattern(...)を組み合わせています。これらはすべて、この lesson で扱った主要なパターンマッチング機能です!

期待される出力:

Empty list
Single item: 42
Pair: hello and world
List starting with 1, length: 5
Alice is 25 years old
Negative: -10
Zero
Positive: 99

自分で試してみよう

import 'classifier.dart';

void main() {
  // TODO: classify関数を使用して各値を分類する
  // そして結果を出力する
  
  // 空のリストでテストする
  print(classify([]));
  
  // TODO: 1つの要素を含むリストでテストする: [42]
  
  // TODO: 2つの要素を含むリストでテストする: ['hello', 'world']
  
  // TODO: より長いリストでテストする: [1, 2, 3, 4, 5]
  
  // TODO: マップでテストする: {'name': 'Alice', 'age': 25}
  
  // TODO: 整数 -10 でテストする
  
  // TODO: 整数 0 でテストする
  
  // TODO: 整数 99 でテストする
}
quiz icon腕試し

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

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Dartオンラインコンパイラ