2013-05-14 46 views
2

我還沒有理解如何處理Dart中的Iterable/Iterator。如何在dart中實現Iterable <E>?

我想我不得不放棄並簡單地返回列表,但這不是我想要的,因爲它會導致我的情況下性能不佳, 。

我想要的是瞭解如何實現我自己的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]; 
} 
+0

也許值得把這個問題的標題改爲「我該如何實現Iterable?」。 – 2013-05-14 21:12:59

+0

請開始接受幫助你的答案。你有12個問題,而且他們中沒有一個人有可接受的答案。 – MarioP 2013-05-15 09:03:27

+0

我現在明白我可以接受答案! – 2013-05-16 13:13:48

回答

4

我看到兩個直接的問題:

  1. iterator是一個getter。代碼不應該爲Iterator<int> iterator() { ... },而應該是Iterator<int> get iterator { ... }

  2. 你的迭代器期待底層的整數列表,但你傳遞的是包裝器。你可能想要構建你的迭代器,如new OddsIterator(_ints),而不是像new OddsIterator(this)

順便說一句,Iterator應該返回null如果你打電話current,你已經超越了盡頭。

+0

謝謝Ladicek!這解決了我的問題。 – 2013-05-14 20:45:10