2

次のコードを使用してローカルファイルを読み取るコンソールアプリケーションを作成しています。

注:後でコードで使用できるように、結果をリストに保存する必要があります。印刷は、後でそれを使ってやりたいことの一例にすぎません。そして、私はファイル読み取りルーチン内ですべてを行うことはできません。後でリストにアクセスする必要があります。

var text = new List();
var config = new File("myfile.txt");
config.readAsLines(Encoding.ASCII).then((List<String> lines) {
  text.add(lines);
});

for (var l in text) print (l);

明らかにこれはうまくいきません、このようなものは私がダーツについて本当に嫌いなものです。では、同期を使用せずにこれを行うには、他にどのようにすべきですか?入力を処理するためにvoidを呼び出さずに、このコードをすべて「メイン」セクションに記述する必要があるため、同期は適切ではありません。また、同期を使用してディレクトリ内のファイルの選択をループし、それをリストに追加して出力を印刷しようとすると、ディレクトリ内の最初のファイルの出力の印刷が繰り返されます。

それで、私がそれをやろうとしている方法でこの仕事をするためのある種の「トリック」がありますか?他のスクリプト言語でのこのような単純な操作は、dartではそれほど単純ではありません:(

4

1 に答える 1

2

dart の API の多くは非同期操作を使用します。通常、この操作はFutureを返します。操作の結果が利用可能になると、 at で指定された関数Future.thenが呼び出されます。

あなたの例では、text.add(lines)に呼び出されるため、その内容を読み取ろうとすると、リストはまだ空です。コードを機能させるには、 をコールバック関数に入れる必要があります。何かのようなもの : for (var l in text) print (l);textprint

main() {
  var config = new File("myfile.txt");
  config.readAsLines(Encoding.ASCII).then(handleLines);
}

handleLines(List<String> lines) {
  for (var l in lines) print(lines);
}

非同期ファイル関数の同期バージョンを使用することもできます。特に、 readAsLinesの同期バージョンであるreadAsLinesSync。そのバージョンでは、コードは次のようになります。

main() {
  var config = new File("myfile.txt");
  List<String> lines = config.readAsLinesSync(Encoding.ASCII);
  for (var l in lines) print (l);
}
于 2013-01-15T08:18:21.620 に答える