Bienvenidos sean a este post, hoy veremos otra forma de condicional.
En el post anterior vimos como trabajar con el condicional if pero al igual que en otros lenguajes no es el unico dado que tambien disponemos de match, si tenemos que hacer una equivalencia es similar al switch de Java o select case de VB, es decir que en lugar de verificar una condicion mira los posibles valores que puede tomar una variable y si coincide ejecuta una accion, su sintaxis es:
match variable
{
valor1 => instruccion,
valor2 => instruccion,
...
valorN => instruccion,
_ => instruccion,
}
Como pueden ver pasamos todos los valores que necesitemos verificar seguido del mismo operador => y despues la instruccion asociada al valor, por ultimo tenemos el parametro _ que lo usaremos para cuando ninguna de las valores anteriores coincidio, para entenderlo mejor vamos a ver un ejemplo.
Para ello vamos a crear un nuevo proyecto que llamaremos coincidir, una vez creado modifficaremos el codigo generado de main.rs con el siguiente:
main.rs
fn main()
{
let booleano = true;
let binario;
match booleano
{
false => binario = 0,
true => binario = 1,
}
println!("{} -> {}", booleano, binario);
}
Un codigo simple donde tenemos dos variables, la primera sera para verificar con el match y la segunda para almacenar un valor, despues usamos a match y utilizamos los dos valores booleanos que disponemos, en caso de ser false establece el valor de cero a binario, nuestra segunda variable, en caso de ser true le asigna el valor de uno a binario, por ultimo mostramos los dos valores que obtuvimos, veamos su salida:
tinchicus@dbn001vrt:~/lenguajes/rust/coincidir$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
Running `target/debug/coincidir`
true -> 1
tinchicus@dbn001vrt:~/lenguajes/rust/coincidir$
Como pueden ver funciono perferctamente porque el valor de booleano al ser true establecio a binario con el valor de 1 pero este codigo se puede mejorar con una tecnica muy interesante que nos permite este metodo, modifiquemos el codigo anterior de la siguiente manera:
main.rs
fn main()
{
let booleano = true;
let binario = match booleano
{
false => 0,
true => 1,
};
println!("{} -> {}", booleano, binario);
}
Como pueden ver quedo un codigo mas simple dado que ahora directamente al momento de definir la variable binario le pasamos el match anterior pero ahora en lugar de asignar el valor a la variable le decimos que si es false o true le asigne el valor 0 o 1 respectivamente, despues por ultimo seguimos mostrando los valores, si lo compilamos y verificamos obtendremos la misma salida que antes.
Esta ultima es la opcion mas utilizada para este lenguaje, donde si necesitamos establecer un valor en una variable en base al valor de otra variable nos viene genial y como recalco siempre un metodo no reemplaza a otro, es decir que este no reemplaza a if sino que pueden complementarse entre ellos.
Por ultimo, como dijimos match equivale al switch/case de otros lenguajes basados en C++, a su vez tambien posee algunas conductas de este como por ejemplo:
switch (x)
{
case 1:
case 2:
case 3:
document.write("Funciono");
break;
default:
document.write("No funciono");
break;
}
En este caso si tenemos tres case donde cualquiera de los tres valores de la variable x coinciden informaremos que funciono de lo contrario con default indicamos que no, como no utilizamos el break seguira al siguiente case ejecutando las tareas y saldra cuando encuentre el break, en este caso la informacion de que funciono, tomemos este mismo ejemplo y pasemoslo a rust:
match x
{
1 | 2 | 3 => println!("Funciono"),
_ => println!("No funciono")
}
Simplemente usando el pipe (|) pasaremos todos los valores que pueden coinicidir para devolver el valor de que funciono y el guion bajo (equivalente al default) para decir que no funciono pero este metodo tambien posee una opcion de rango para establecer cuales valores se pasaran para la coincidencia, veamos el siguiente codigo:
match x
{
1 ... 10 => println!("Funciono"),
_ => println!("No funciono")
}
En este caso es muy similar salvo que le estamos informando que si el valor de x esta entre 1 y 10 debe mostrar el mensaje de funciono, de lo contrario mostrara el otro, esto tambien puede aplicarse a caracteres (char), por ejemplo:
match x
{
'A' ... 'Z' => println!("Funciono"),
_ => println!("No funciono")
}
Por ultimo tambien podemos unir estos valores a una variable para poder saber exactamente cual es, por ejemplo tomemos el siguiente codigo:
match x
{
p @ 1 ... 10 => println!("El valor es: {}", p),
_ => printl!("No funciono")
}
En este caso primero chequeamos si el valor de x esta entre 1 y 10, en caso de ser verdadero toma ese valor y por medio del operador arroba (@) lo asigna o une a la variable p, una vez almacenado este valor podremos usarlo como queramos, en este caso lo usamos para mostrarlo en pantalla, despues tenemos el guion bajo para mostrar en pantalla un mensaje en caso de no coincidir, por ultimo tambien podemos usar al operador pipe de la siguiente forma:
match x
{
p @ 1 ... 10 | p @ 11 ... 20 => println!("El valor es: {}", p),
_ => printla!("No funciono")
}
Esto es una fusion de estos dos conceptos porque un lado almacenaremos la coincidencia de los dos rangos en p y despues lo manejaremos como queramos.
En resumen, hoy hemos visto a match, su sintaxis, su equivalencia en otros lenguajes, un ejemplo para ponerlo en practica, luego una version mejorada para una mejor practica y por ultimo algunas conductas que podemos aprovechar para mejorarlo para nuestros codigos, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
