美文网首页
dart语法10-生成器

dart语法10-生成器

作者: jxtx | 来源:发表于2020-05-16 17:05 被阅读0次

    dart语法1
    dart语法2-内置类型
    dart语法3-函数
    dart语法4-操作符
    dart语法5-异常
    dart语法6-类
    dart语法7-泛型
    dart语法8-库
    dart语法9-异步
    dart语法10-生成器
    dart语法11

    生成器

    同步生成器

    使用sync*,返回的是Iterable对象。
    yield会返回moveNext为true,并等待 moveNext 指令。
    调用getSyncGenerator立即返回Iterable对象。
    调用moveNext方法时getSyncGenerator才开始执行。

    Main(){
      var it = getSyncGenerator(5).iterator;
      while (it.moveNext()) {
        print(it.current);
      }
    }
    
    Iterable<int> getSyncGenerator(int n) sync* {
      print('start');
      int k = 0;
      while (k < n) {
        yield k++;
      }
      print('end');
    }
    
    

    异步生成器

    使用async*,返回的是Stream对象。
    yield不用暂停,数据以流的方式一次性推送,通过StreamSubscription进行控制。
    调用getAsyncGenerator立即返回Stream,只有执行了listen,函数才会开始执行。
    listen返回一个StreamSubscription 对象进行流监听控制。
    可以使用StreamSubscription对象对数据流进行控制。

    Main(){
    //getAsyncGenerator(5).listen((value) => print(value));
      StreamSubscription subscription = getAsyncNumIterator(5).listen(null);
      subscription.onData((value) {
        print(value);
        if(value>=2){
          subscription.pause();
        }
      });
    }
    
    Stream<int> getAsyncGenerator(int n) async* {
      print('start');
      int k = 0;
      while (k < n) {
        yield k++;
      }
      print('end');
    }
    
    

    递归生成器

    yield* 以指针的方式传递递归对象,而不是整个同步对象。

    Main(){
      var it = getSyncRecursiveGenerator(5).iterator;
      while (it.moveNext()) {
        print(it.current);
      }
    }
    
    Iterable<int> getSyncRecursiveGenerator(int n) sync* {
      if (n > 0) {
        yield n;
        yield* getSyncNumDownFrom(n - 1);
      }
    }
    
    

    相关文章

      网友评论

          本文标题:dart语法10-生成器

          本文链接:https://www.haomeiwen.com/subject/ezrrohtx.html