El Parámetro Self
Parte de la sección Object Oriented Programming 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 struct, utiliza el parámetro &self. Este parámetro especial es siempre el primer argumento en un método y representa una referencia a la instancia sobre la cual se llama al método.
El símbolo & significa que estamos tomando prestada la instancia en lugar de tomar posesión de ella. 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 puntos. El método area lee tanto width como height para calcular y devolver el resultado.
Debido a que &self solo toma prestada la instancia, puedes llamar a múltiples métodos en 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()); // falso
}
Los métodos que usan &self son de solo lectura; pueden examinar los datos de la estructura pero no pueden cambiarlos. En la siguiente lección, aprenderás cómo crear métodos que pueden 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, luego imprime la circunferencia y el diámetro en líneas separadas.
Formato de salida esperado:
{circumference}
{diameter}Hoja de referencia
Los métodos acceden a los datos de la estructura utilizando el parámetro &self, que debe ser el primer argumento. El símbolo & significa que el método toma prestada la instancia en lugar de tomar su propiedad:
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 método, utiliza self con la notación de puntos para acceder a los campos de la estructura. Los métodos con &self son de solo lectura y pueden examinar los datos pero no modificarlos.
Debido a que &self solo toma prestada la instancia, puedes llamar a múltiples métodos en la misma estructura:
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
Pruébalo tú mismo
use std::io;
// TODO: Define la estructura Circle aquí
// TODO: Agrega 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 circunferencia y el diámetro
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
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 multimedia