【问题标题】:What does 'yield' keyword do in flutter?'yield' 关键字在颤振中有什么作用?
【发布时间】:2019-09-10 13:30:17
【问题描述】:

yield 关键字在 Dart 中的实际作用是什么?

【问题讨论】:

    标签: flutter dart yield


    【解决方案1】:

    yield 为周围的async* 函数的输出流添加一个值。类似于return,但不会终止函数。

    https://dart.dev/guides/language/language-tour#generators

    Stream asynchronousNaturalsTo(n) async* {
      int k = 0;
      while (k < n) yield k++;
    }
    

    当 yield 语句执行时,它将计算其表达式的结果添加到流中。它不一定会挂起(尽管在当前的实现中会挂起)。

    【讨论】:

    • It's like return, but doesn't terminate the function. 多么完美的方式来解释这一点,而无需深入讨论。谢谢。也就是说,如果你想深入了解这个主题,Tokenet 在下面有一个很好的答案。
    • 完美,加一,简短完整的答案和比较
    【解决方案2】:

    已接受答案的链接已损坏,here 是关于async* sync* yield* yield 的官方链接。

    如果您对其他语言有一些经验,您可能会停留在这些关键字上。以下是一些克服关键字的提示

    1. async* sync* yield* yield 被称为生成器函数。您可能主要在 Bloc 模式中使用这些。

    2. async* 也是async,你可以像往常一样使用异步

    3. sync* 不能用作sync,您将收到提示“修饰符同步必须后跟星号”的错误。

    4. yieldyield* 只能与生成器函数async*sync*)一起使用。

    一共有四种组合。

    1. async* yield 将返回 Stream&lt;dynamic&gt;
    Stream<int> runToMax(int n) async* {
      int i = 0;
      while (i < n) {
        yield i;
        i++;
        await Future.delayed(Duration(seconds: 300));
      }
    }
    
    1. async* yield* 将调用一个函数并返回 Stream&lt;dynamic&gt;
    Stream<int> countDownFrom(int n) async* {
      if (n > 0) {
        yield n;
        yield* countDownFrom(n - 1);
      }
    }
    
    1. sync* yield 将返回 Iterable&lt;dynamic&gt;
    Iterable<int> genIterates(int max) sync* {
      var i = 0;
      while (i < max) {
        yield i;
        i++;
      }
    }
    
    1. sync* yield* 将调用一个函数并返回 Iterable&lt;dynamic&gt;
    Iterable<int> countDownFrom(int n) sync* {
      if (n > 0) {
        yield n;
        yield* countDownFrom(n - 1);
      }
    }
    

    如果有任何错误,请发表评论以更正答案。

    【讨论】:

    • 我修复了答案中的链接。
    • 我认为 yield* 的正确答案是委托给另一个生成器而不是调用一个函数。 yield* 只是简单地委托给另一个生成器,这意味着当前生成器停止,另一个生成器接管工作,直到它停止生产。在停止生成值之后,主生成器继续生成自己的值。
    • @mirkancal 这是一个非常明确的解释,它应该成为一个答案,而不仅仅是评论。
    【解决方案3】:

    yield 语句只能在生成器的函数中使用。
    生成器的函数以自然方式生成数据项(如计算、从外部接收、预定义值等)。
    当下一个数据项准备好时,yield 语句将该项发送到数据序列中,这本质上是函数的生成结果。
    数据序列可以是同步的,也可以是异步的。
    在 Dart 语言中,同步数据序列是指Iterable 的实例。
    异步数据序列是指Stream的实例。

    附言
    生成器函数可以无限期地生成数据项,直到函数返回。
    但与普通函数不同的是,结果(数据序列)会在函数调用后立即返回,可以立即使用。
    在这种情况下,只有在生成器函数将终止(成功或失败)时才能到达数据序列的结尾。

    【讨论】:

      【解决方案4】:

      我认为 yield* 的正确答案是委托给另一个生成器而不是调用函数。 yield* 只是简单地委托给另一个生成器,这意味着当前生成器停止,另一个生成器接管工作,直到它停止生产。在那之后停止生成值,主生成器继续生成自己的值。

      感谢@András Szepesházi 鼓励我发表此评论作为答案,希望对您有所帮助。

      【讨论】:

      • 不错的答案。我正在寻找这个。 ?
      猜你喜欢
      • 2011-05-18
      • 2012-07-01
      • 2022-11-29
      • 2011-01-17
      • 2014-09-27
      • 2018-11-13
      • 2020-11-19
      相关资源
      最近更新 更多