Rate this post

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...');  
}  

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now