El Parámetro Self
Parte de la sección Programación Orientada a Objetos del Journey de Rust de Coddy. Lección 2 de 61.
Cuando un método necesita acceder a los datos almacenados en una instancia de una estructura, utiliza el parámetro &self. Este parámetro especial siempre es el primer argumento de un método y representa una referencia a la instancia sobre la que se llama al método.
El símbolo & significa que estamos tomando prestada la instancia en lugar de asumir su propiedad. Esto permite que el método lea los campos de la estructura sin consumir la instancia:
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn is_square(&self) -> bool {
self.width == self.height
}
}
Dentro del cuerpo del método, self te da acceso a todos los campos de la estructura usando la notación de punto. El método area lee tanto width como height para calcular y devolver el resultado.
Como &self solo toma prestada la instancia, puedes llamar a varios métodos sobre la misma estructura sin ningún problema:
fn main() {
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
}
Los métodos que usan &self son de solo lectura. Pueden examinar los datos de la estructura, pero no pueden cambiarlos. En la próxima lección, aprenderás a crear métodos que puedan modificar la instancia.
Desafío
FácilCrea una estructura Circle con un solo campo: radius (f64).
Añade un bloque de implementación para Circle con dos métodos que utilicen &self:
circumference: devuelve la circunferencia comof64(fórmula:2.0 * 3.14159 * radius)diameter: devuelve el diámetro comof64(fórmula:2.0 * radius)
Recibirás una entrada:
- El radio del círculo (f64)
Crea una instancia de Circle con el radio proporcionado y, después, imprime la circunferencia y el diámetro en líneas separadas.
Formato de salida esperado:
{circumference}
{diameter}Pruébalo tú mismo
use std::io;
// TODO: Define la estructura Circle aquí
// TODO: Añade el bloque de implementación para Circle con los métodos circumference y diameter
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let radius: f64 = input.trim().parse().expect("Invalid number");
// TODO: Crea una instancia de Circle e imprime la circumference y el diameter
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Métodos y Comportamiento
Intro a Bloques de ImplementaciónEl Parámetro SelfMétodos MutablesFunciones AsociadasMúltiples Bloques de ImplementaciónEncadenamiento de MétodosResumen - Acciones de Rectángulo4Proyecto: Mascota virtual
Definir la mascotaAlimentar a la mascota7Traits estándar
El trait DebugEl trait DisplayClone y CopyTraits de igualdadResumen - Punto imprimible10Proyecto: Sistema de documentos
El Trait DrawComponente de texto2Encapsulamiento y módulos
Conceptos básicos de módulosLa palabra clave PublicCampos privadosGettersSettersRepaso - Casillero seguro5Genéricos
Estructuras genéricasMétodos genéricosMúltiples tipos genéricosFunciones genéricasResumen - Punto de coordenadas8Traits como límites
Sintaxis de límites de traitsLímites múltiplesLa cláusula whereRetornar tipos con traitsResumen: Impresora genérica11Patrones de diseño en Rust
Patrón NewtypeComposiciónEl Trait DropFrom e IntoResumen - Mock de Smart Pointer3Enums avanzados
Enums con datosMétodos en EnumsCoincidencia de variantes de datosEl Enum Option revisitadoResumen - Enum Shape6Definición de Traits
¿Qué es un Trait?Implementación de TraitsImplementaciones por defectoSobrescribir valores por defectoTraits con parámetrosResumen - Reproductor multimediaPractica por tu cuenta: Compilador de Rust online