Saltar al contenido

Diferencia entre yield y yield* en Dart

Intenta comprender el código bien previamente a utilizarlo a tu proyecto y si ttienes algo que aportar puedes dejarlo en los comentarios.

Solución:

yield

Se utiliza para emitir valores de flujo.

Ejemplo (yield)

Stream str() async* 
  List numbers = [1, 2, 3, 4, 5];
  for (var i in numbers) 
    if (i > 2) yield i; // only yield numbers greater than 2
  


main() async 
  await for (var i in str()) 
    print(i);
  

Producción:

3
4
5

yield*

Delega a otro generador y después de que el otro generador deja de producir valores, vuelve a generar sus propios valores.

Ejemplo yield*

Stream numbersDownFrom(int n) async* 
  if (n > 2) 
    yield n;
    yield* numbersDownFrom(n - 1);
  


main() async 
  await for (int i in numbersDownFrom(5)) 
    print('$i');
  


Producción:

5 
4 
3 

Fuente

Fuente

Respuesta corta

  • yield devuelve valores de un Iterable o un Stream.
  • yield* se usa para llamar recursivamente a su función Iterable o Stream.

Ejemplos

Veamos algunos ejemplos del video Generator Functions – Flutter in Focus. Solo veremos el ejemplo de Iterable, pero es similar para Streams.

Formulario 1

Aquí hay un Iterable que cuenta desde start para finish.

Iterable getRange(int start, int finish) sync* 
  for (int i = start; i <= finish; i++) 
    yield i;
  

Él yield palabra clave devuelve el siguiente valor en cada iteración.

Formulario 2

Ahora refactoricemos esa función para que sea recursiva. Por fuera sigue haciendo lo mismo que antes:

Iterable getRange(int start, int finish) sync* 
  if (start <= finish) 
    yield start;
    for (final val in getRange(start + 1, finish)) 
      yield val;
    
  

Esto funciona, pero es difícil de leer y no es muy eficiente debido al bucle.

Formulario 3

Ahora vamos a refactorizarlo de nuevo usando yield* (pronunciado "estrella de rendimiento"):

Iterable getRange(int start, int finish) sync* 
  if (start <= finish) 
    yield start;
    yield* getRange(start + 1, finish);
  

Todavía es recursivo, pero ahora es más fácil de leer y más eficiente.

Tienes la opción de asistir nuestra misión añadiendo un comentario o dejando una valoración te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *