パターンとマッチング (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 に一致します。アンダースコア _ は、あらゆるものに一致するワイルドカードとして機能します。シールドクラスと組み合わせることで、パターンによって複雑なデータ構造を網羅的かつ型安全に扱えるようになります。
チャレンジ
簡単パターンマッチングを使用してさまざまな種類の入力を分析・分類するデータ classifier を構築しましょう!Dart 3 の強力なパターンマッチング機能を使って、さまざまなデータ構造を識別し、説明できるシステムを作成します。
コードを 2 つのファイルに分けて整理します。
classifier.dart:Objectパラメーターを受け取り、Stringの説明を返すclassifyfunction を作成します。パターンマッチングを使用する 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(
whenclause を使用)はNegative: [value]を返す - 0 である integer は
Zeroを返す - その他の integer は
Positive: [value]を返す - その他の値は
Unknown typeを返す
- 空の list
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
- 空の list
この 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 でテストする
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ13高度な OOP の概念
コンポジション vs 継承拡張メソッドCallable クラスSealed クラス (Dart 3)レコード (Dart 3)パターンとマッチング (3.0)メソッドを持つ Enum自分で練習してみよう: Dartオンラインコンパイラ