分岐
このページでは、分岐を使用してDartコードの制御フローを制御する方法を示します。
if
文と要素if-case
文と要素switch
文と式
Dartでは、次を使用して制御フローを操作することもできます。
if
#Dartは、オプションのelse
句付きのif
文をサポートしています。if
の後の括弧内の条件は、ブール値に評価される式である必要があります。
if (isRaining()) {
you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket();
} else {
car.putTopDown();
}
式コンテキストでif
を使用する方法については、条件式を参照してください。
if-case
#Dartのif
文は、パターンに続くcase
句をサポートしています。
if (pair case [int x, int y]) return Point(x, y);
パターンが値と一致する場合、パターンがスコープ内に定義した変数を使用して分岐が実行されます。
前の例では、リストパターン[int x, int y]
は値pair
と一致するため、return Point(x, y)
分岐はパターンが定義した変数x
とy
を使用して実行されます。
そうでない場合、制御フローは、存在する場合はelse
分岐に進み、実行されます。
if (pair case [int x, int y]) {
print('Was coordinate array $x,$y');
} else {
throw FormatException('Invalid coordinates.');
}
if-case文は、単一のパターンに対して一致してデストラクチャリングを行う方法を提供します。複数のパターンに対して値をテストするには、switchを使用します。
switch文
#switch
文は、一連のケースに対して値式を評価します。各case
句は、値が照合されるパターンです。あらゆる種類のパターンをケースに使用できます。
値がケースのパターンと一致すると、ケースの本体が実行されます。空でないcase
句は、完了後にswitchの最後にジャンプします。break
文は必要ありません。空でないcase
句を終了する他の有効な方法は、continue
、throw
、またはreturn
文です。
default
またはワイルドカード_
句を使用して、case
句と一致しない場合にコードを実行します。
var command = 'OPEN';
switch (command) {
case 'CLOSED':
executeClosed();
case 'PENDING':
executePending();
case 'APPROVED':
executeApproved();
case 'DENIED':
executeDenied();
case 'OPEN':
executeOpen();
default:
executeUnknown();
}
空のケースは次のケースにフォールスルーするため、ケースが本体を共有できます。フォールスルーしない空のケースには、本体にbreak
を使用します。非連続的なフォールスルーには、continue文
とラベルを使用できます。
switch (command) {
case 'OPEN':
executeOpen();
continue newCase; // Continues executing at the newCase label.
case 'DENIED': // Empty case falls through.
case 'CLOSED':
executeClosed(); // Runs for both DENIED and CLOSED,
newCase:
case 'PENDING':
executeNowClosed(); // Runs for both OPEN and PENDING.
}
論理和パターンを使用して、ケースが本体またはガードを共有できるようにします。パターンとケース句の詳細については、switch文と式のパターンドキュメントを参照してください。
switch式
#switch
式は、一致するケースの式本体に基づいて値を生成します。Dartで式が許可される場所であればどこでもswitch式を使用できますが、式文の開始時を除きます。例:
var x = switch (y) { ... };
print(switch (x) { ... });
return switch (x) { ... };
式文の先頭にswitchを使用する場合は、switch文を使用してください。
switch式を使用すると、次のようなswitch文を書き直すことができます。
// Where slash, star, comma, semicolon, etc., are constant variables...
switch (charCode) {
case slash || star || plus || minus: // Logical-or pattern
token = operator(charCode);
case comma || semicolon: // Logical-or pattern
token = punctuation(charCode);
case >= digit0 && <= digit9: // Relational and logical-and patterns
token = number();
default:
throw FormatException('Invalid');
}
次のような式にします。
token = switch (charCode) {
slash || star || plus || minus => operator(charCode),
comma || semicolon => punctuation(charCode),
>= digit0 && <= digit9 => number(),
_ => throw FormatException('Invalid')
};
switch
式の構文は、switch
文の構文とは異なります。
- ケースは
case
キーワードで始まりません。 - ケース本体は、一連の文ではなく、単一の式です。
- 各ケースには本体が必要です。空のケースには暗黙的なフォールスルーはありません。
- ケースパターンは、
:
ではなく=>
を使用して本体から区切られています。 - ケースは
,
で区切られています(オプションで末尾の,
も許可されます)。 - デフォルトケースは
default
と_
の両方を使用する代わりに、_
のみを使用できます。
網羅性チェック
#網羅性チェックは、値がswitchに入力できるのにケースと一致しない可能性がある場合にコンパイル時エラーを報告する機能です。
// Non-exhaustive switch on bool?, missing case to match null possibility:
switch (nullableBool) {
case true:
print('yes');
case false:
print('no');
}
デフォルトケース(default
または_
)は、switchを流れる可能性のあるすべての値をカバーします。これにより、あらゆる型のswitchが網羅的になります。
列挙型とsealed型は、デフォルトケースがなくても可能な値が既知であり、完全に列挙できるため、switchに特に役立ちます。sealed
修飾子をクラスで使用して、そのクラスのサブタイプを切り替える際の網羅性チェックを有効にします。
sealed class Shape {}
class Square implements Shape {
final double length;
Square(this.length);
}
class Circle implements Shape {
final double radius;
Circle(this.radius);
}
double calculateArea(Shape shape) => switch (shape) {
Square(length: var l) => l * l,
Circle(radius: var r) => math.pi * r * r
};
誰かがShape
の新しいサブクラスを追加した場合、このswitch
式は不完全になります。網羅性チェックによって、欠落しているサブタイプが通知されます。これにより、多少関数型代数データ型スタイルでDartを使用できます。
ガード句
#case
句の後にオプションのガード句を設定するには、キーワードwhen
を使用します。ガード句はif case
の後、およびswitch
文と式の両方に続くことができます。
// Switch statement:
switch (something) {
case somePattern when some || boolean || expression:
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Guard clause.
body;
}
// Switch expression:
var value = switch (something) {
somePattern when some || boolean || expression => body,
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Guard clause.
}
// If-case statement:
if (something case somePattern when some || boolean || expression) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Guard clause.
body;
}
ガードは、一致した後に任意のブール式を評価します。これにより、ケース本体を実行するかどうかについて、さらなる制約を追加できます。ガード句がfalseに評価されると、実行はswitch全体を終了するのではなく、次のケースに進みます。
特に明記されていない限り、このサイトのドキュメントはDart 3.5.3を反映しています。ページは2024年2月27日に最終更新されました。 ソースを表示 または 問題を報告する。