Menu
Coddy logo textTech

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.

challenge icon

Desafío

Fácil

Crea 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 como f64 (fórmula: 2.0 * 3.14159 * radius)
  • diameter: devuelve el diámetro como f64 (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
    
}
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Rust online