前のページ

言語編

次のページ


制御フロー文 (Control flow statements)

以下のもののいずれかを使って自分のDartコードのフローを制御できる:

  • ifelse

  • forループ

  • whiledo-whileループ

  • breakcontinue

  • switchcase

  • assert

また次章の「例外」で示されているようにtry-catchthrowを使って制御フローに作用させることができる。



ifelse (If and else)

Dartは次のサンプルに示してあるように、オプショナルなelse文を持ったif文に対応している。また「条件式」の項も参照のこと。

if (isRaining()) {
  you.bringRainCoat();
} else if (isSnowing()) {
  you.wearJacket();
} else {
  car.putTopDown();
}

JavaScriptと違って、条件はブール値を使わねばならない、それ以外の手段はない。更なる詳細は「組込み型」の章の「ブール値」の節を参照のこと。



forループ (For loops)

標準のforループを使って繰り返しができる。例えば:

var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
  message.write('!');
}

Dartforループ内のクロージャたちはインデックスの値を捕捉し、JavaScriptで一般的に起こす落とし穴を回避している。例えば以下のコードを考えてみよう:

var callbacks = [];
for (var i = 0; i < 2; i++) {
  callbacks.add(() => print(i));
}
callbacks.forEach((c) => c());

期待した通り出力は0、次に1となる。しかしJavaScriptは初めに2、次に2を表示する。

自分が繰り返させているオブジェクトがIterable型のときは、forEach()メソッドが使える。もし現在の繰り返しカウンタを知る必要がない場合はforEach()を使うのは良い選択肢である:

candidates.forEach((candidate) => candidate.interview());

ListSetのようなIterableクラスはまた繰り返しのfor-in書式が使える:

var collection = [0, 1, 2];
for (var x in collection) {
  print(x); // 0 1 2
}



whiledo-while (While and do-while)

whileループはループの前に条件を計算する:

while (!isDone()) {
  doSomething();
}

do-whileループはそのループの後に条件を計算する:

do {
  printLine();
} while (!atEndOfPage());



breakcontinue (Break and continue)

ループ中を停止するにはbreakを使う:

while (true) {
  if (shutDownRequested()) break;
  processIncomingRequests();
}

次のループの繰り返しにスキップするにはcontinueを使う:

for (int i = 0; i < candidates.length; i++) {
  var candidate = candidates[i];
  if (candidate.yearsExperience < 5) {
    continue;
  }
  candidate.interview();
}

もしリストやセットのようなIterableを使っているときは、この例は別の書き方ができる:

candidates
    .where((c) => c.yearsExperience >= 5)
    .forEach((c) => c.interview());



switchcase (Switch and case)

Dartに於けるswitch文は整数、文字列、あるいはコンパイル時常数たちを==を使って比較する。比較されたオブジェクトたちの総てが同じクラス(そしてその副型のどれでも無い)のインスタンスでなければならず、そのクラスは==をオーバライドしてはならない。列挙型はswitch文で良く機能する。

注意:Dartswitch文はインタープリタやスキャナのような限られた環境の中で使われることを意図している。

非空のcase句は通例break文で終了する。非空のcase句を終了させる他の有効な手段はcontinuethrow或いはreturn文である。

マッチするcase句がないときコードを実行させるときはdefault句を使用する:

var command = 'OPEN';
switch (command) {
  case 'CLOSED':
    executeClosed();
    break;
  case 'PENDING':
    executePending();
    break;
  case 'APPROVED':
    executeApproved();
    break;
  case 'DENIED':
    executeDenied();
    break;
  case 'OPEN':
    executeOpen();
    break;
  default:
    executeUnknown();
}

以下の例ではcase句の中のbreak文をオミットしているので、エラーを生成している:

var command = 'OPEN';
switch (command) {
  case 'OPEN':
    executeOpen();
    // ERROR: Missing break
  case 'CLOSED':
    executeClosed();
    break;
}

しかしながら、Dartは空のcase句に対応していて、フォールスルーの形式を許している:

var command = 'CLOSED';
switch (command) {
  case 'CLOSED': // 空のcaseにはフォールスルーする
  case 'NOW_CLOSED':
    // CLOSEDNOW_CLOSEDの双方で走る
    executeNowClosed();
    break;
}

もし本当にフォールスルーが欲しいのなら、continue文とラベルを使うことができる:

var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
    executeClosed();
    continue nowClosed;
  // nowClosedラベルで実行を継続する
  nowClosed:
  case 'NOW_CLOSED':
    // CLOSEDNOW_CLOSEDの双方で走る
    executeNowClosed();
    break;
}

case句はローカル変数を持てるが、それはその句のスコープ内でのみ可視である。



Assert

もしブール条件がfalseのときに通常の実行を中断させる為にassert文を使用する。この解説の至る所でassert文の例を見てきた筈である。以下は更に幾つかの例を示す:

// その変数が確実に非null値を持っているようにする
assert(text != null);
// その変数が確実に100以下の値を持っているようにする
assert(number < 100);
// これが確実にhttps URLであるようにする
assert(urlString.startsWith('https'));

注意:assert文は運用用のコードでは効果を持たない;これらは開発段階のみの為のものである。Flutterはデバッグ・モードでのassertを可能としている。dartdevcのような開発専用のツールは一般的にデフォルトでassertに対応している。dartdart2jsのような一部のツールではコマンド行フラグ: --enable-assertsを介してassertに対応している:

あるメッセージをassertに付すには、第2引数として文字列を付加する。

assert(urlString.startsWith('https'),
    'URL ($urlString) should start with "https".');

assertの最初の引数はブール値に計算されるどの式もなり得る。もしこの式の値がtrueのときはこのアサーションは成功しており、実行が継続される。もしfalseの時は、このアサーションは失敗しており、例外(AssertionError)がスローされる。





前のページ

次のページ