Difference between revisions of "Control de flujo de ejecución"

From El Mago del Rust
Jump to navigation Jump to search
 
(10 intermediate revisions by the same user not shown)
Line 15: Line 15:
</syntaxhighlight>
</syntaxhighlight>


La expresión a evaluar debe ser de tipo <code>bool</code>, de lo contrario producirá un [[Errores_de_compilación#Errores_en_el_uso_de_las_variables|error 308]].
La expresión a evaluar debe ser de tipo <code>bool</code>, de lo contrario producirá un [[Errores_de_compilación#Errores_en_el_uso_de_las_variables|error 308]]. Sobre comparaciones entre variables, se puede ver [[Comparaciones|acá]]


El <code>else</code> es opcional, y se pueden colocar varias expresiones <code>if/else</code> en cascada:
El <code>else</code> es opcional, y se pueden colocar varias expresiones <code>if/else</code> en cascada:
Line 33: Line 33:
</syntaxhighlight>
</syntaxhighlight>


Si debes poner muchos <code>if/else</code> en cascada, lo mejor sería usar un [[match]].
Si debes poner muchos <code>if/else</code> en cascada, lo mejor sería usar un [[#Match]].


==Usando en <code>let</code>==
==Usando en <code>let</code>==
Line 49: Line 49:
Al ejecutar este programa, la salida sería "1".
Al ejecutar este programa, la salida sería "1".


=Lazos=
=Lazos con <code>loop</code>=
El comando <code>loop</code> causa que un bloque de código se repita infinitas veces a menos de que explícitamente se le ordene que termine. Este código nunca terminará:
El comando <code>loop</code> causa que un bloque de código se repita infinitas veces a menos de que explícitamente se le ordene que termine. Este código nunca terminará:


Line 73: Line 73:
     }
     }
  }
  }
</syntaxhighlight>


En este programa, al llegar la impresión a 100, terminará el programa.
En este programa, al llegar la impresión a 100, terminará el programa.


==Devolviendo un valor==
<code>loop</code> ejecuta una expresión varias veces y se puede utilizar el <code>break</code> para devolver un valor, por ejemplo en una asignación:
<syntaxhighlight lang="rust" line='line' highlight="1">
fn main() {
    let mut a =0;
    let b= loop {
        a=a+1;
        if a == 100 {
            break a;
        }
    };
    println!("{}",b);
}
</syntaxhighlight>
=Lazos condicionales con <code>while</code>=
Una forma de tener un lazo con un condicional es usar <code>while</code>. El programa anterior modificado sería:
<syntaxhighlight lang="rust" line='line' highlight="1">
fn main() {
    let mut a =0;
    while a != 100 {
        a=a+1;
    }
    println!("{}",a);
}
</syntaxhighlight>
=Lazos con <code>for</code>=
Hay varias formas de usar <code>for</code> para crear un lazo con un iterador.
==Iterador con <code>..</code>==
Con un iterador <code>a..b</code>, los valores van desde a inclusive hasta b (excluyendolo):
<syntaxhighlight lang="rust" line='line' highlight="1">
fn main() {
    for a in 1..10 {
        println!("{}",a);
    }
}
</syntaxhighlight>
En este ejemplo, se imprimirán los valores desde 1 hasta 9. En este caso la variable <code>a</code> no necesita ser declarada explícitamente antes.
Si quisiéramos que el iterador fuera desde a hasta b inclusive, podemos poner un <code>=</code> antes de la segunda variable:
<syntaxhighlight lang="rust" line='line' highlight="1">
fn main() {
    for a in 1..=10 {
        println!("{}",a);
    }
}
</syntaxhighlight>
==Iteradores==
Hay varios iteradores: <code>into_iter</code>, <code>iter</code> y <code>iter_mut</code>.
===<code>iter</code>===
Toma cada elemento de la colección para cada iteración.
<syntaxhighlight lang="rust" line='line' highlight="1">
fn main() {
    let a = [0,1,2];
    for x in a.iter() {
        println!("{}",x);
    }
}
</syntaxhighlight>
</syntaxhighlight>
En este ejemplo, se imprime los números 0,1,2.
===<code>iter_iter</code>===
Toma cada elemento de la colección y lo saca de la misma. Al final del for, la colección estará vacía.
===<code>iter_mut</code>===
Toma cada elemento, permitiendo su modificación.
=Match=
<code>Match</code> permite encontrar patrones, que se pueden usar como un <code>switch</code> en el lenguaje C:
<syntaxhighlight lang="rust" line='line' highlight="1">
fn main() {
    let a=5;
    match a {
        1 => println!("uno"),
        2 | 3 | 5 | 7 => println!("es un número primo"),
        _ => println! ("cualquier otro número"),
    }
}
</syntaxhighlight>
Cada opción está separada por una coma, y se usa | para considerar varias opciones a la vez.

Latest revision as of 23:43, 8 March 2021

Las dos estructuras más importantes para el control del flujo de ejecución son los lazos y la expresión if:

Expresiones if/else[edit]

Muy similar a otros lenguajes, se evalúa si es falso o verdadero una expresión. En este caso se evalúa si una variable es menor a 10 o no:

 fn main() {
     let a = 5;
     if a < 10 {
         println!("la expresión es verdadera");
     }else {
         println!("la exprexión es false");
     }
 }

La expresión a evaluar debe ser de tipo bool, de lo contrario producirá un error 308. Sobre comparaciones entre variables, se puede ver acá

El else es opcional, y se pueden colocar varias expresiones if/else en cascada:

 fn main() {
     let a = 5;
     if a == 10 {
         println!("la variable es 10");
     }else if a == 4 {
         println!("la variable es 4");
     }else if a == 7 {
         println!("la variable es 7");
     }else {
         println!("la variable no es ni 10, 4 ni 7");
     }
 }

Si debes poner muchos if/else en cascada, lo mejor sería usar un #Match.

Usando en let[edit]

Como el if es una expresión, se puede utilizar en el lado derecho de un let:

 fn main() {
     let a = 5;
     let b = 7;
     let c = if a>b {3} else {1};
     println!("El valor es {}",c);
 }

Al ejecutar este programa, la salida sería "1".

Lazos con loop[edit]

El comando loop causa que un bloque de código se repita infinitas veces a menos de que explícitamente se le ordene que termine. Este código nunca terminará:

 fn main() {
     loop {
         println!("hola");
     }
 }

La única forma de que deje de imprimir "hola" es usando Control-C.

Saliendo de un lazo con break[edit]

Con break la iteración termina y se sale del lazo.

 fn main() {
     let mut a=0;
     loop {
         a=a+1;
         println!("{}",a);
         if a == 100 {break;}
     }
 }

En este programa, al llegar la impresión a 100, terminará el programa.

Devolviendo un valor[edit]

loop ejecuta una expresión varias veces y se puede utilizar el break para devolver un valor, por ejemplo en una asignación:

 fn main() {
     let mut a =0;
     let b= loop {
         a=a+1;
         if a == 100 {
             break a;
        }
     };
     println!("{}",b);
 }

Lazos condicionales con while[edit]

Una forma de tener un lazo con un condicional es usar while. El programa anterior modificado sería:

 fn main() {
     let mut a =0;
     while a != 100 {
         a=a+1;
     }
     println!("{}",a);
 }

Lazos con for[edit]

Hay varias formas de usar for para crear un lazo con un iterador.

Iterador con ..[edit]

Con un iterador a..b, los valores van desde a inclusive hasta b (excluyendolo):

 fn main() {
     for a in 1..10 {
        println!("{}",a);
     }
 }

En este ejemplo, se imprimirán los valores desde 1 hasta 9. En este caso la variable a no necesita ser declarada explícitamente antes.

Si quisiéramos que el iterador fuera desde a hasta b inclusive, podemos poner un = antes de la segunda variable:

 fn main() {
     for a in 1..=10 {
        println!("{}",a);
     }
 }

Iteradores[edit]

Hay varios iteradores: into_iter, iter y iter_mut.

iter[edit]

Toma cada elemento de la colección para cada iteración.

 fn main() {
     let a = [0,1,2];
     for x in a.iter() {
        println!("{}",x);
     }
 }

En este ejemplo, se imprime los números 0,1,2.

iter_iter[edit]

Toma cada elemento de la colección y lo saca de la misma. Al final del for, la colección estará vacía.

iter_mut[edit]

Toma cada elemento, permitiendo su modificación.

Match[edit]

Match permite encontrar patrones, que se pueden usar como un switch en el lenguaje C:

fn main() {
    let a=5;

    match a {
        1 => println!("uno"),
        2 | 3 | 5 | 7 => println!("es un número primo"),
        _ => println! ("cualquier otro número"),
    }
}

Cada opción está separada por una coma, y se usa | para considerar varias opciones a la vez.