Lecciones del módulo (2/2)
Métodos y bloques impl
En Rust, los métodos son similares a las funciones, pero se definen dentro del contexto de una struct (o de un enum o trait) y su primer parámetro es siempre self, que representa la instancia de la struct sobre la cual se llama al método.
Definir los Métodos con impl
Para definir los métodos en una struct, se usa un bloque impl (implementation) con el nombre de la struct:
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
// Questo è un metodo d'istanza. Prende &self in lettura.
fn area(&self) -> u32 {
self.width * self.height
}
}
fn main() {
let rect = Rectangle { width: 30, height: 50 };
// Chiamata al metodo tramite notazione con punto
println!("L'area è: {}", rect.area());
}
Funciones Asociadas (Estáticas)
Las funciones definidas en un bloque impl que no aceptan self como primer parámetro se denominan funciones asociadas (equivalentes a los métodos estáticos en otros lenguajes).
A menudo se utilizan como constructores para devolver nuevas instancias de la struct. Para llamarlas se usa la sintaxis de doble dos puntos :::
impl Rectangle {
// Funzione associata
fn square(size: u32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}
}
fn main() {
// Chiamata alla funzione associata
let sq = Rectangle::square(10);
}
Métodos que Modifican el Estado: &mut self
Si un método necesita modificar los campos de la struct, debe declarar el primer parámetro como &mut self. La propia instancia sobre la que se llama al método debe declararse como mutable (let mut):
impl Rectangle {
fn double_size(&mut self) {
self.width *= 2;
self.height *= 2;
}
}
Pruébalo tú
Completa el bloque impl definiendo el método area que tome &self y devuelva u32 (la multiplicación de width y height).
Mostrar pista
Escribe `fn area(&self) -> u32 { self.width \* self.height }`dentro del bloque`impl Rectangle`.
Solución disponible después de 3 intentos
Define la función asociada square dentro de impl Rectangle, que reciba size: u32 y devuelva una instancia de Rectangle con ancho y alto igual a size.
Mostrar pista
Escribe `fn square(size: u32) -> Rectangle { Rectangle { width: size, height: size } }`dentro del bloque`impl`.
Solución disponible después de 3 intentos
Añada el método mutador scale a Rectangle dentro del bloque impl. El método scale debe tomar una referencia mutable a self (&mut self) y un parámetro factor: u32, y multiplicar tanto width como height de Rectangle por factor.
Mostrar pista
Implementa `fn scale(&mut self, factor: u32)`para actualizar`self.width`y`self.height`multiplicándolos por`factor`.
Solución disponible después de 3 intentos