Anuncios

Bienvenidos sean a este post, hoy tocaremos uno de los temas mas importantes del lenguaje.

Anuncios

La definicion de un trait seria la siguiente:

Un trait es una coleccion de metodos definidos para un tipo desconocido: self

El tinchicus
Anuncios

A su vez se puede acceder a otros metodos declarados en el mismo trait, si tenemos que hacer una equivalencia seria a una interface de otros lenguajes, si bien es parecido no es exactamente lo mismo, la forma de trabajo del trait es:

  • El trait establece la parte abstracta o interfaz
  • El impl hace la implementacion o definicion de los metodos
  • Y por ultimo el codigo utiliza al impl
Anuncios

Al igual que sucede en otros lenguajes, como C++, no es obligatorio hacerlo en un solo archivo sino tambien podemos hacerlo por medio de librerias de Rust llamadas Crate, al igual que sucede con los archivos .h de C++ y tal como sucede con estos siempre que tengamos definidos en alguna parte los elementos del codigo estos se juntaran al momento de compilarlo y funcionara, su sintaxis basica es:

trait nombre
{
	fn nombre_func(&self) -> tipo_retorno;
}
Anuncios

Le asignamos un nombre y dentro debemos declarar todas las funciones que tendra este trait, solamente declararlas sin definirlas como si fueran los prototipos en otros lenguajes, despues por medio de impl iremos definiendo cada uno de estos prototipos, vamos a ver un pequeño ejemplo.

Anuncios

Para ello crearemos un nuevo ejemplo que llamaremos rasgo, una vez generado iremos al archivo main.rs y modificaremos el codigo creado con el siguiente:

main.rs

struct Perimetro
{
	tam_uno: i32,
	tam_dos: i32,
}

struct Ovalo
{
	radio: f32,
	altura: f32,
}

trait CalcPerim
{
	fn calc_perim(&self) -> i32;
}

trait CalcOval
{
	fn calc_oval(&self) -> f32;
}

impl CalcPerim for Perimetro
{
	fn calc_perim(&self) -> i32
	{
		self.tam_uno * 2 + self.tam_dos * 2
	}
}

impl CalcOval for Ovalo
{
	fn calc_oval(&self) -> f32
	{
		3.1415927f32 * self.radio * self.altura
	}
}

fn main() 
{
	let peri = Perimetro { tam_uno: 5, tam_dos: 12 };
	let ovalo = Ovalo { radio: 5.1f32, altura: 12.3f32 };

	println!(
		"Lado 1 = {}, Lado 2 = {}, Perimetro = {}",
		peri.tam_uno, peri.tam_dos, peri.calc_perim()
		);
	println!(
		"Radio = {}, Altura = {}, Area = {}",
		ovalo.radio, ovalo.altura, ovalo.calc_oval()
		);
}
Anuncios

Uno de los codigos mas extensos que hicimos pero facilito, primero crearemos dos struct, el primero para el perimetro con dos propiedades para dos lados (tam_uno y tam_dos), el siguiente struct es para un ovalo y tambien tendra dos propiedades para la altura y el radio, lo siguiente seran dos trait, el primero sera llamado CalcPerim y tendra un prototipo para una funcion llamada calc_perim donde pasaremos al self como atributo y le diremos que devuelva un valor de tipo i32, el siguiente trait se llama CalcOval y tambien solo tendra un prototipo de una funcion llamada calc_oval que tambien recibira un self como argumento y devolvera un valor de tipo f32, ahora viene lo mas interesante.

Anuncios

En este caso definiremos dos impl para los prototipos que definimos en los trait anteriores, vamos a tomar el primero para explicarlo:

impl CalcPerim for Perimetro
{
	fn calc_perim(&self) -> i32
	{
		self.tam_uno * 2 + self.tam_dos * 2
	}
}
Anuncios
Anuncios

A diferencia de como vimos en el post anterior en lugar de pasar el nombre del struct para el impl le pasamos el nombre del trait seguido de un for y despues de este si pasamos el struct, esto es para decirle que esto implementara el trait para este struct, dentro de este definiremos la funcion de la misma forma y en ella agregaremos las operacion que hara, observen que usamos el self con las dos propiedades de este struct, el siguiente impl es exactamente lo mismo pero pasaremos el otro trait y el otro struct con su respectiva operacion, por ultimo tenemos el main donde primero crearemos dos objetos de nuestros struct y les pasaremos los datos pertinentes, por ultimo tenemos dos lineas para mostrar no solamente los valores de las propiedades de cada objeto sino tambien el valor que devuelve cada metodo de estos objetos, pasemos a compilar y veamos su salida:

tinchicus@dbn001vrt:~/lenguajes/rust/rasgo$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/rasgo`
Lado 1 = 5, Lado 2 = 12, Perimetro = 34
Radio = 5.1, Altura = 12.3, Area = 197.07211
tinchicus@dbn001vrt:~/lenguajes/rust/rasgo$
Anuncios

En resumen, hoy hemos visto trait, que es, como trabaja, a que equivale en otros lenguajes, si bien no trabaja de la misma forma si lo hace de una forma muy parecida, despues hemos visto un ejemplo para verlo en accion y como trabaja, 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
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50