如何在dart中实现Iterable <e>?</e>

时间:2013-05-14 14:38:06

标签: dart

我仍然不明白如何处理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];
}

2 个答案:

答案 0 :(得分:4)

我看到两个直接的问题:

  1. iterator是一个吸气剂。代码不应为Iterator<int> iterator() { ... },而应为Iterator<int> get iterator { ... }

  2. 您的迭代器期望基础整数列表,但您传递的是包装器。您可能希望构建像new OddsIterator(_ints)这样的迭代器,而不是new OddsIterator(this)

  3. 顺便说一下,Iterator如果您致电null并且您已经超越了结束,则应该返回current

答案 1 :(得分:1)

class Count extends Iterable with Iterator {
  Count([this.limit = 10]);
  int limit;
  int i = 0;

  @override
  int get current => i;

  @override
  bool moveNext() {
    i++;    
    return i <= limit;
  }

  @override
  Iterator get iterator => this;
}