Flutter開發Dart極速入門 (生成器)

生成器

同步生成器

void main() {

  print('main start');

  Iterator iterator = syncGenerator(5).iterator;
  while (iterator.moveNext()) {
    print(iterator.current);
  }

  print('main end');
}

// 同步生成器
Iterable<int> syncGenerator(int n) sync*{
  print('start');
  int i = n;
  while(i > 0) {
    print('generator: $i');
    yield i-- ;	// yield 產出結果
  }
  print('end');
}

異步生成器

void main() {

  print('main start');

  StreamSubscription subscription = asyncGenerator(5).listen(null);
  subscription.onData((handleData) {
    print(handleData);
    if (handleData > 1) {	// 異步生成器可以被中斷
      subscription.pause();
    }
  });
//  StreamSubscription subscription = asyncGenerator(5).listen((value) {
//    print('sub $value');
//  });

  print('main end');
}

// 異步生成器
Stream<int> asyncGenerator(int n) async*{
  print('start');
  int i = 0;
  while(i < n){
    print('generator: $i');
    yield i++;	// yield 產出結果
  }
  print('end');
}

yield 與 yield*

  • yield 直接輸出結果
  • yield* 輸出一個函數指針, 也就是說實際將會執行yield* 所表示的函數

遞歸生成器

void main() {

  print('main start');
  // 遞歸生成器
  Iterator iterator = getSyncRecursiveGenerator(5).iterator;
  while (iterator.moveNext()){
    print(iterator.current);
  }

  print('main end');
}

// 遞歸生成器
Iterable<int> getSyncRecursiveGenerator(int n) sync* {
  if (n > 0) {
    yield n;	// yield 產出結果
    yield* getSyncRecursiveGenerator(n - 1);	// yield* 調用函數
  }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章