本节目标

  • 同步、异步代码生成器

环境

  • Dart 2.1.0

同步生成器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
main(List<String> args) {
var it = naturalsTo(5).iterator;
while(it.moveNext()) {
print(it.current);
}
}

Iterable<int> naturalsTo(int n) sync* {
print('start');
int k = 0;
while (k < n) {
yield k++;
}
print('end');
}

yield 会等待 moveNext 指令

异步生成器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import 'dart:async';

main(List<String> args) {
// 流监听
// asynchronousNaturalsTo(5).listen((onData) {
// print(onData);
// });

// 流监听 StreamSubscription 对象
StreamSubscription subscription = asynchronousNaturalsTo(5).listen(null);
subscription.onData((value) {
print(value);
// subscription.pause();
});
}

Stream<int> asynchronousNaturalsTo(int n) async* {
print('start');
int k = 0;
while (k < n) {
yield k++;
}
print('end');
}

以流的方式一次性推送

StreamSubscription 对象进行流监听控制

递归生成器

1
2
3
4
5
6
7
8
9
10
11
12
13
main(List<String> args) {
var it = naturalsDownFrom(5).iterator;
while(it.moveNext()) {
print(it.current);
}
}

Iterable<int> naturalsDownFrom(int n) sync* {
if ( n > 0) {
yield n;
yield* naturalsDownFrom(n-1);
}
}

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

代码

参考


© 猫哥

https://ducafecat.tech