Difference between revisions of "Control de flujo de ejecución"
(→Lazos) |
|||
| (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 [[ | 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.