Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre las struct.

Anuncios

Para aquellos que estan familiarizados con C este tipo de dato les sera bastante familiar para lo que podemos decir que es una version primitiva de las clases, dado que nos permite tener varios tipos de datos en una misma estructura, esta podemos considerarla como una coleccion, pasemos a ver como es su sintaxis basica:

struct nombre
{
	... variables ...
}
Anuncios

Siempre debemos asignarle un nombre, dentro de esta iran las distintas variables que compondran a nuestro struct, les paso uno de ejemplo:

struct estructura
{
	foo: i32,
	bar: i32,
}
Anuncios

Observen como pasamos el nombre de la variable, seguido del tipo, no tienen que ser todas del mismo tipo necesariamente, y todas seran separadas por comas (,) como se ve en el ejemplo, para entenderlo vamos a crear un nuevo ejemplo.

Anuncios

Para ello crearemos un nuevo proyecto que llamaremos estructura, una vez creado modificaremos el codigo de main.rs generado con el siguiente:

main.rs

struct Persona
{
	nombre: String,
	edad: i32,
	apellido: String,
}

fn main() 
{
	let usuario = Persona {
		nombre: String::from("Martin"),
		apellido: String::from("Miranda"),
		edad: 33,
		};

	println!("Nombre: {}", usuario.nombre);
	println!("Apellido: {}", usuario.apellido);
	println!("Edad: {}", usuario.edad);
}
Anuncios
Anuncios

Esta es la forma mas basica de trabajarlo, primero creamos la struct llamada Persona, en esta crearemos una serie de variables para almacenar algunos datos del mismo, observen que tenemos dos de tipo String y otros dos de tipo int de 32 bits, como dijimos en este caso no influye que sean de distintos tipos, en el main creamos una variable con esta struct, en ella pasaremos los tres datos del mismo, vean que no es necesario respetar el orden de como se crearon pero si deben respetar el nombre de las mismas, con nuestro nuevo objeto creado mostraremos los distintos valores almacenados en este mediante tres println, compilemos y veamos su salida:

tinchicus@dbn001vrt:~/lenguajes/rust/estructura$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
     Running `target/debug/estructura`
Nombre: Martin
Apellido: Miranda
Edad: 33
tinchicus@dbn001vrt:~/lenguajes/rust/estructura$
Anuncios

Con esto hablamos sobre que es una definicion de una struct pero esto podemos transformarlo en una instancia para poder modificar los datos, para ello debemos modificar una linea:

let usuario = Persona {
Anuncios

De la siguiente manera:

let mut usuario = Persona {
Anuncios

Esto lo hacemos asi para que nos permita modificar los datos que establecemos para esta variable, el resto lo dejamos como estaba pero agregaremos la siguiente linea despues de definida la variable:

usuario.edad = 45;
Anuncios

En este caso le pasamos esta linea para que modifique el valor de la variable edad por una nueva, con esto comentado veamos como quedo el codigo ahora:

main.rs

struct Persona
{
	nombre: String,
	edad: i32,
	apellido: String,
}

fn main() 
{
	let mut usuario = Persona {
		nombre: String::from("Martin"),
		apellido: String::from("Miranda"),
		edad: 33,
		};
	usuario.edad = 45;

	println!("Nombre: {}", usuario.nombre);
	println!("Apellido: {}", usuario.apellido);
	println!("Edad: {}", usuario.edad);
}
Anuncios

Si lo compilamos y probamos veremos la siguiente salida:

tinchicus@dbn001vrt:~/lenguajes/rust/estructura$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/estructura`
Nombre: Martin
Apellido: Miranda
Edad: 45
tinchicus@dbn001vrt:~/lenguajes/rust/estructura$
Anuncios

A su vez nosotros podemos usar un struct dentro de otro struct, como una especie de hijo de esta, para entenderlo vamos a tomar el ejemplo anterior y vamos a modificarlo de la siguiente manera:

main.rs

struct Area
{
	oficina: String,
	puesto: String,
}

struct Persona
{
	nombre: String,
	edad: i32,
	apellido: String,
	area: Area,
}

fn main() 
{
	let mut usuario = Persona {
		nombre: String::from("Martin"),
		apellido: String::from("Miranda"),
		edad: 33,
		area: Area{
			oficina: String::from("IT"),
			puesto: String::from("Tecnico")
			}
		};
	usuario.edad = 45;

	println!("Nombre: {}", usuario.nombre);
	println!("Apellido: {}", usuario.apellido);
	println!("Edad: {}", usuario.edad);
	println!("Oficina: {}", usuario.area.oficina);
	println!("Puesto: {}", usuario.area.puesto);
}
Anuncios
Anuncios

Para este caso creamos primero una nueva struct llamada Area, en esta tendremos dos datos como son la oficina y el puesto de esta area, despues dentro de Persona agregamos una nueva variable llamada area la cual tiene como tipo el struct que vimos anteriormente, por ahora es asi de simple, lo interesante viene en el main dado que ahora debemos completar ese dato, para ello pasaremos el nuevo struct con una nueva llave para ingresar los nuevos dos valores, luego de las tres lineas originales para mostrar los datos agregamos dos mas, en estas pueden ver como recuperamos los datos, primero debemos informar el struct padre o maestro (usuario), luego el hijo de este (area) y por ultimo la variable que vamos a mostrar, si lo compilamos veremos la siguiente salida:

tinchicus@dbn001vrt:~/lenguajes/rust/estructura$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
     Running `target/debug/estructura`
Nombre: Martin
Apellido: Miranda
Edad: 45
Oficina: IT
Puesto: Tecnico
tinchicus@dbn001vrt:~/lenguajes/rust/estructura$
Anuncios

Por ultimo como curiosidad podemos declarar un struct sin ningun tipo de dato, esto se denomina como unit-like struct, la cual es especialmente util para cuando tenemos traits donde queremos tener un tipo que no almacene ningun tipo de dato pero de esto hablaremos mas adelante.

Anuncios

En resumen, hoy hemos visto lo basico de struct, como son, para que nos sirven, como nos ayudan para trabajar con nuestros codigos, que posibilidades nos brinda, 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.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50