7

Dart で Iterable/Iterator を処理する方法をまだ理解していません。

あきらめて単にリストを返す必要があると思いますが、私の場合はパフォーマンスが低下するため、それは私が望んでいることではありません。

私が欲しいのは、独自の Iterable/Iterator を実装する方法を理解することです。

これらの試みが両方とも失敗するのはなぜですか?

library foo;

import 'dart:collection';

// Both attemps below raises the following error:
// ==============================================
//
// Closure call with mismatched arguments: function 'moveNext'
//
// NoSuchMethodError: incorrect number of arguments passed to method named 'moveNext'
// Receiver: Closure: (dynamic) => Iterator<int> from Function 'iterator':.
// Tried calling: moveNext()


main() {
  Iterable<int> iterable1 = new OddsIterableDartStyle([1,2,4,6,7,8,9]);
  for (int i in iterable1)
    print("ODD: $i");

  Iterable<int> iterable2 = new OddsIterableJavaStyle([1,2,4,6,7,8,9]);
  for (int i in iterable2)
    print("ODD: $i");
}

// ------------------------------------------

class OddsIterableDartStyle extends Object with IterableMixin<int> {
  List<int> _ints;

  OddsIterableDartStyle(this._ints);

  Iterator<int> iterator() {
    return new OddsIterator(this);
  }
}

// ------------------------------------------

class OddsIterableJavaStyle implements Iterable<int> {
  List<int> _ints;

  OddsIterableJavaStyle(this._ints);

  Iterator<int> iterator() {
    return new OddsIterator(this);
  }

}

// ------------------------------------------

class OddsIterator implements Iterator<int> {  // Iterate over odd numbers
  List<int> _ints;
  int _index;

  OddsIterator(this._ints) {
    _index = -1;
  }

  bool moveNext() {
    while (++_index < _ints.length) {
      if (_ints[_index].isOdd)
        return true;
    }
    return false;
  }

  int get current => (_index < 0) ? null : _ints[_index];
}
4

2 に答える 2

6

差し迫った問題が 2 つあります。

  1. iteratorゲッターです。コードは を読むべきではなくIterator<int> iterator() { ... }、そうすべきIterator<int> get iterator { ... }です。

  2. イテレータは基になる整数リストを期待していますが、ラッパーを渡しています。new OddsIterator(_ints)おそらく、好きではなく好きなようにイテレータを構築したいと思うでしょうnew OddsIterator(this)

ところで、あなたが電話して、あなたがすでに終わりを越えて動いているならIterator、戻るはずです。nullcurrent

于 2013-05-14T15:29:26.040 に答える