🧦

for(final d in days) ... これはできるのか?

に公開

これは何か?

for in ... を使った文法が、table_calendarのコードにあった。でも通常はfor in ()の外に...で繋げて、変数とか関数は呼べないようだ???
何か特殊な処理が内部でされているようだ。

今回は自作したけど、for inの後に、...をつけるよくわからないコードを再現してみた。

void main() {
  // ListにDateTimeを複数追加する
  List<DateTime> dates = [];
  dates.add(DateTime(2020, 1, 1));
  dates.add(DateTime(2020, 1, 2));
  dates.add(DateTime(2020, 1, 3));
  print('for in ...でループする');
  dateLoop(dates);
  print(dateLoop(dates));
}

List<String> getEventsForDay(DateTime day) {
  // Implementation example
  return [day.toString()];
}

// 引数でdatesを渡して、forと ...でループする関数
List<DateTime> dateLoop(List<DateTime> dates) {
  [
    for (var d in dates) ...getEventsForDay(d),
  ];
  return dates;
}

実行結果:

最後に

どうやってこれを実現したのかと言うと...

Listの中に、引数で渡された日付を文字に変換して保存する関数を定義する。

List<String> getEventsForDay(DateTime day) {
  // Implementation example
  return [day.toString()];
}

これを使うと、for (var d in dates) ...関数というコードを使うことができました!
Listの中にあるから...が使えるんでしょうね。スプレッド演算子はJavaScriptでもあるのですが、配列を新しく生成したりするときに使われます。
returnで戻り値として、for in ... を使っているListを渡すことができます。

// 引数でdatesを渡して、forと ...でループする関数
List<DateTime> dateLoop(List<DateTime> dates) {
  [
    for (var d in dates) ...getEventsForDay(d),
  ];
  return dates;
}

ブレークポイントを打って🐝虫のボタンを押すとデバッグしてどのようにプログラムが動いているか確認することができます。

Discussion