Bienvenidos sean a este post, hoy hablaremos sobre la fusion de dos conceptos.
Hasta el post anterior hemos visto que son los struct, en este post hablamos sobre los tuple y hoy hablaremos sobre como estos dos conceptos pueden fusionarse en uno solo, vamos a recordar la sintaxis basica de un struct con el siguiente ejemplo:
struct bar
{
bebida: bool,
numero: i32,
precio: f32,
}
Tenemos varias variables con distintos tipos para almacenar informacion sobre un tema en particular, en este caso tenemos bebidas, donde la primera sera para saber si hay stock o no, seguido del numero de identificacion de esta y por ultimo su precio, cuando hablamos de tuple en este post mencionamos que podiamos definirlos de esta manera:
let (uno, dos, tres) = (1, 2, 3);
Donde asignariamos a cada referencia un valor, tomando el ejemplo anterior no podriamos hacer lo siguiente:
let bar: (bool, i32, f32) = (true, 1, 2.7);
Si bien podemos hacerlo de esta manera tendremos un inconveniente muy grande como es la recuperacion de la informacion porque no podremos acceder a los elementos internos, por otro lado tampoco asignar este struct a otro, debido a que no puedes tener dos structs identicas que se diferencien solo con el nombre, para esto Rust nos permite lo que mencionamos al comienzo como es un hibrido entre struct y tuple, para ello su sintaxis es la siguiente:
struct nombre(argumentos);
Donde nombre sera el identificador del struct y en argumentos pasamos los valores que generan la estructura interna del struct, para entenderlo mejor veamos los siguientes ejemplos:
struct bebida1(bool, i32, f32);
struct bebida2(bool, i32, f32);
Como pueden ver ahora no solo tenemos la practicidad del tuple sino tambien la seguridad que nos ofrece struct, si bien sus estructuras son identicas estos se consideran dos tipos distintos, a su vez nos permite acceder a su informacion como si fuera un tuple normal, veamos un ejemplo:
let i = bebida1.1;
Esto tiene multiples usos pero uno de ellos es para cuando debemos usar el tuple struct pero con un solo elemento, para entenderlo vamos a crear un nuevo proyecto.
Primero vamos a crear un nuevo proyecto llamado nuevotipo, una vez creado tomaremos el codigo generado en main.rs y lo modificaremos con el siguiente:
main.rs
struct MiPi(f32);
fn main()
{
let mi_pi = MiPi(22f32 / 7f32);
let MiPi(pi) = mi_pi;
println!("pi = {}", pi);
}
Primero definimos nuestro tuple struct llamado MiPi con un valor unico de tipo float, luego en el main crearemos un objeto del struct anterior, para ello le pasamos una division entre dos valores de tipo float para que coincidan con la estructura interna, lo que hacemos despues se denomina como asignacion de patron de tipo nuevo, lo cual nos permite crear un nuevo tipo distinto del valor contenido, por ultimo mostramos el valor que almacenamos en la variable que usamos como identificacion de la linea anterior, si lo compilamos y probamos veremos la siguiente salida:
tinchicus@dbn001vrt:~/lenguajes/rust/nuevotipo$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/nuevotipo`
pi = 3.142857
tinchicus@dbn001vrt:~/lenguajes/rust/nuevotipo$
Esto nos servira como base para un tipo de struct que mencioamos en este post, los de tipo unit-like, las cuales nos permiten declarar un struct pero que despues manejaremos con los trait, aunque como mencionamos en ese post sera un tema que veremos cuando hablemos sobre estos ultimos.
En resumen, hoy hemos visto otra variedad de struct, como se compone, como nos beneficia, como podemos utilizarlo y como se aplica en un ejemplo practico, 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
