Dart Generator là một chức năng duy nhất cho phép chúng tôi tạo ra một chuỗi các giá trị. Generators trả về giá trị theo yêu cầu; nó có nghĩa là giá trị được tạo ra khi chúng ta cố gắng lặp qua các trình vòng lặp. Dart cung cấp hỗ trợ tích hợp cho hai loại chức năng của Generators.
- Synchronous Generators
- Asynchronous Generators
Các bài viết liên quan:
Synchronous Generator
Nó trả về một đối tượng có thể lặp lại mang giá trị một cách đồng bộ. Từ khóa năng suất được sử dụng cùng với việc đánh dấu thân chức năng của bộ tạo đồng bộ là đồng bộ * với các giá trị của bộ tạo.
Hãy hiểu ví dụ sau về Generators đồng bộ.
Ví dụ:
main() { print("Dart Synchronous Generator Example."); oddNumber(10).forEach(print); } // syn* functions returns an iterable Iterable<int> oddNumber(int num) sync* { int k = num; while(k >= 0) { if(k%2 == 1) { // 'yield' statement yield k; } k--; } }
Giải trình:
Trong chương trình trên, chúng ta đã khai báo một hàm lẻNumber (10) với vòng lặp foreach không có phần thân của nó. Vòng lặp foreach sẽ lặp lại hàm. Bây giờ, chúng ta đã tạo hàm lẻNumber (10) làm hàm máy phát đồng bộ.
Trong thân hàm, chúng ta đã khởi tạo một biến mới k, biến này gán đối số n. Sau đó, chúng tôi áp dụng vòng lặp while để lặp lại hàm và phần thân của vòng lặp được lặp cho đến khi giá trị của k nhỏ hơn hoặc bằng 0.
Chúng tôi đã thực hiện hoạt động mô-đun trên k để tìm các số lẻ từ Generators. Chúng tôi đã sử dụng câu lệnh lợi nhuận, câu lệnh này sẽ tạm dừng việc thực thi của hàm và trả về giá trị tại một thời điểm. Nó sẽ trả về giá trị của mỗi lần thực thi chức năng của trình tạo. Khi điều kiện của vòng lặp while trở thành sai, thì vòng lặp kết thúc và in ra các số lẻ.
ASynchronous Generator
Nó trả về một đối tượng luồng mang giá trị không đồng bộ. Từ khóa năng suất được sử dụng cùng với việc đánh dấu thân hàm của bộ tạo không đồng bộ là không đồng bộ * với các giá trị của bộ tạo.
Hãy hiểu ví dụ sau:
Ví dụ –
main() { print("Dart Asynchronous Generator Example."); asyncNaturalsTo(10).forEach(print); } // async* functions returns an stream object Stream<int> asyncNaturalsTo(int num) async* { int k = 0; while(k < num) { // 'yield' statement yield k++; } k--; }
Giải trình:
Đoạn mã trên đã tạo các giá trị không đồng bộ. Hàm asyncNaturalsTo (int num) trả về một luồng đối tượng trong mỗi lần thực thi thân hàm. Ở đây, từ khóa lợi nhuận hoạt động giống như ví dụ trước; nó dừng việc thực thi hàm, trả về giá trị và tiếp tục thực thi cho lần lặp tiếp theo. Nó sẽ xảy ra lặp đi lặp lại cho đến khi thân chức năng bị chấm dứt.
Chúng ta hãy hiểu các khái niệm sau đây liên quan đến chức năng Generators.
yield Keyword
Năng suất trả về một giá trị duy nhất cho chuỗi tại một thời điểm nhưng không dừng hoàn toàn việc thực thi chức năng của trình tạo. Nó trả về một giá trị cho mỗi lần thực thi chức năng của trình tạo.
sync* Keyword –
Từ khóa sync * được sử dụng để khai báo chức năng đồng bộ hóa bộ tạo. Nó trả về giá trị khi chúng ta cố gắng lặp lại giá trị không phải khi nó được tạo. Hãy xem ví dụ sau:
Ví dụ –
void main() { print('creating iterator'); Iterable<int> numbers = getNumbers(4); // Here we are creating iterator print('Iteration starts...'); for (int i in numbers) { print('$i'); // Iterate over the iterator } print('end of main function'); } Iterable<int> getNumbers(int n) sync* { // define generator synchronously print('generator started'); for (int i = 0; i < n; i++) { yield i; } print('generator function ended'); }
Giải trình
Hàm trình tạo ở trên đã tạo ra giá trị khi chúng ta lặp qua trình lặp.
async* Keyword
Từ khóa async được sử dụng để khai báo bộ tạo không đồng bộ. Nó trả về đối tượng luồng. Hãy hiểu ví dụ sau:
Ví dụ
void main() { print('creating iterator'); Stream<int> numbers = getNumbers(4); print('starting to listen...'); numbers.listen((int k) { print('$k'); }); print('end of the main function'); } Stream<int> getNumbers(int number) async* { // declaring asynchronous generator function print('waiting inside generator a 3 seconds :)'); await new Future.delayed(new Duration(seconds: 3)); //sleep 3s print('started generating values...'); for (int i = 0; i < number; i++) { await new Future.delayed(new Duration(seconds: 1)); //sleep 1s yield i; } print('ended generating values...'); }