dart-use-pattern-matching
適切な場面でswitch式とパターンマッチングを活用します。条件分岐を簡潔かつ表現力豊かに記述できる場面を自動的に検出し、より読みやすいDartコードへとリファクタリングします。
description の原文を見る
Use switch expressions and pattern matching where appropriate
SKILL.md 本文
Dart パターンの実装
目次
パターン選択戦略
データ構造と目的の結果に基づいて、特定のパターンタイプを適用します。以下の条件付きガイドラインに従ってください:
- デシリアライズされたデータ (JSON など) の検証と抽出を行う場合: Map パターンと List パターンを使用して、構造チェックとキー・バリュー・ペアの分解を同時に行います。
- 複数の戻り値を処理する場合: Record パターンを使用して、フィールドをローカル変数に直接分解します。
- 型固有の動作を実行する場合 (代数的データ型): Object パターンを
sealedクラスと組み合わせて、網羅性を確保します。 - 数値範囲または条件にマッチさせる場合: リレーショナル (
>=,<=) パターンと論理積 (&&) パターンを使用します。 - 複数のケースがロジックを共有する場合: 論理和 (
||) パターンを使用して、単一のケース本体またはガード句を共有します。 - 特定の値を無視する場合: ワイルドカードパターン (
_) またはコレクション内の非マッチング Rest 要素 (...) を使用します。
Switch 文と式
実行コンテキストに基づいて、適切な switch 構成を選択します:
- 値を生成する場合: switch 式を使用します。
- 構文:
switch (value) { pattern => expression, } - ルール: 各ケースは単一の式である必要があります。暗黙的なフォールスルーはありません。網羅的である必要があります。
- 構文:
- ステートメントまたは副作用を実行する場合: switch 文を使用します。
- 構文:
switch (value) { case pattern: statements; } - ルール: 空のケースは次のケースにフォールスルーします。空でないケースは暗黙的にブレークします (
breakキーワードは不要です)。
- 構文:
コアパターン実装
次の構文とルールを使用してパターンを実装します:
- 論理和 (
||):pattern1 || pattern2。両方のブランチは正確に同じ変数セットを定義する必要があります。 - 論理積 (
&&):pattern1 && pattern2。ブランチは重複する変数を定義してはいけません。 - リレーショナル:
==,!=,<,>,<=,>=の後に定数式が続きます。 - キャスト (
as):pattern as Type。値が型にマッチしない場合、スローします。分解中に型を強制的にアサートするために使用します。 - Null チェック (
?):pattern?。値が null の場合、マッチに失敗します。変数を non-nullable な基本型にバインドします。 - Null アサート (
!):pattern!。値が null の場合、スローします。 - 変数:
var nameまたはType name。マッチした値を新しいローカル変数にバインドします。 - ワイルドカード (
_): すべての値にマッチし、破棄します。 - リスト:
[pattern1, pattern2]。Rest 要素 (...または...var rest) が使用される場合を除き、正確な長さのリストにマッチします。 - Map:
{"key": pattern}。指定されたキーを含むマップにマッチします。マッチしないキーは無視されます。 - Record:
(pattern1, named: pattern2)。正確な形状のレコードにマッチします。:var nameを使用してゲッター名を推測します。 - Object:
ClassName(field: pattern)。ClassNameのインスタンスにマッチします。:var fieldを使用してゲッター名を推測します。
ワークフロー
タスク進捗: パターンマッチング実装
複雑なパターンマッチングロジックを実装する際の進捗追跡には、このチェックリストをコピーしてください:
- 評価されるデータ構造を特定します (JSON、Record、Class、Enum)。
- 適切な switch 構成を選択します (値には Expression、副作用には Statement)。
- 必要なパターンを定義します (Object、Map、List、Record)。
- 変数パターン (
var x、:var y) を使用して必要なデータを抽出します。 - ガード句 (
when condition) を適用して、パターンで表現できないロジックを処理します。 - ワイルドカード (
_) またはdefault句を使用してマッチしないケースを処理します (sealed クラスを使用しない場合)。 - 網羅性バリデータを実行します。
フィードバックループ: 網羅性チェック
sealed クラスまたは列挙型にスイッチする場合、すべてのサブタイプが処理されることを確認する必要があります。
- バリデータを実行:
dart analyzeを実行します。 - エラーを確認: 「The type 'X' is not exhaustively matched by the switch cases」エラーを探します。
- 修正: 処理されていないサブタイプの Object パターンを追加するか、デフォルトフォールバックが許容される場合はワイルドカード (
_) ケースを追加します。
例
JSON 検証と分解
Map パターンと List パターンを使用して、1 つのステップで構造を検証してデータを抽出します。
入力:
var data = {
'user': ['Lily', 13],
};
実装:
if (data case {'user': [String name, int age]}) {
print('User $name is $age years old.');
} else {
print('Invalid JSON structure.');
}
代数的データ型 (Sealed クラス)
Object パターンと switch 式を使用して、ファミリー型を網羅的に処理します。
実装:
sealed class Shape {}
class Square implements Shape {
final double length;
Square(this.length);
}
class Circle implements Shape {
final double radius;
Circle(this.radius);
}
// switch 式は `sealed` モディファイアのため網羅性を保証します。
double calculateArea(Shape shape) => switch (shape) {
Square(length: var l) => l * l,
Circle(:var radius) => math.pi * radius * radius,
};
変数スワップと分解
変数代入パターンを使用して、一時変数なしで値をスワップまたはレコードフィールドを抽出します。
実装:
var (a, b) = ('left', 'right');
(b, a) = (a, b); // 値をスワップ
// 関数の戻り値を分解
var (name, age) = getUserInfo();
ガード句と論理和
when を使用してパターンがマッチした後に任意の条件を評価します。
実装:
switch (shape) {
case Square(size: var s) || Circle(size: var s) when s > 0:
print('Valid symmetric shape with size $s');
case Square() || Circle():
print('Invalid or empty shape');
default:
print('Unknown shape');
}
ライセンス: BSD-3-Clause(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- dart-lang
- リポジトリ
- dart-lang/skills
- ライセンス
- BSD-3-Clause
- 最終更新
- 不明
Source: https://github.com/dart-lang/skills / ライセンス: BSD-3-Clause
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。