Dart Generators

2024 年 8 月 29 日 | 4 分钟阅读

Dart 生成器是一个独特的功能,它允许我们生成一系列值。生成器按需返回值;这意味着当尝试迭代迭代器时,将生成值。 Dart 提供了对两种类型的生成器函数的内置支持。

  • 同步生成器
  • 异步生成器

同步生成器

它返回一个可迭代对象,该对象同步地携带值。 yield 关键字与将同步生成器函数体标记为 sync* 一起使用,以生成值。

让我们理解以下同步生成器的示例。

示例 -

输出

Dart Synchronous Generator Example.
9
7
5
3
1

说明

在上面的程序中,我们声明了一个带有 foreach 循环的 oddNumber(10) 函数,该函数没有函数体。 foreach 循环将迭代该函数。现在,我们将 oddNumber(10) 函数创建为同步生成器函数。

在函数体中,我们初始化了一个新变量 k,它分配了参数 n。然后,我们应用 while 循环来迭代该函数,并且循环体被迭代,直到 k 的值小于或等于 0。

我们对 k 进行了模运算,以从生成器中找到奇数。我们使用了 yield 语句,该语句暂停了函数的执行并一次返回一个值。它将返回生成器函数每次执行的值。当 while 循环的条件变为 false 时,循环终止并打印奇数。

异步生成器

它返回一个流对象,该对象异步地携带值。 yield 关键字与将异步生成器函数体标记为 async* 一起使用,以生成值。

让我们理解以下示例 -

示例 -

输出

Dart Asynchronous Generator Example.
0
1
2
3
4
5
6
7
8
9

说明

上面的代码异步生成了值。 asyncNaturalsTo(int num) 函数在函数体的每次执行中都返回流对象。这里, yield 关键字的行为与之前的例子相同;它停止了函数的执行,返回了该值,并恢复了下一次迭代的执行。它将反复发生,直到函数体终止。

让我们理解与生成器函数相关的以下概念。

yield 关键字

yield 一次将单个值返回给序列,但不会完全停止生成器函数的执行。它为生成器函数的每次执行返回一个值。

sync* 关键字 -

sync* 关键字用于声明同步生成器函数。当我们尝试迭代值时,它会返回值,而不是在创建时返回值。让我们看一下以下示例 -

示例 -

输出

creating iterator
Iteration starts...
generator started
0
1
2
3
generator function ended
end of main function

解释 -

上面的生成器函数在我们迭代迭代器时生成了值。

async* 关键字

async 关键字用于声明异步生成器。它返回流对象。让我们理解以下示例 -

示例 -

输出

creating iterator
starting to listen...
end of the main function
waiting inside generator a 3 seconds :)
started generating values...
0
1
2
3
ended generating values...

注意 - 复制上面的代码并将其粘贴到您的 Dart 编辑器中。您可以清楚地看到同步生成器和异步生成器之间的区别。