Menu
Coddy logo textTech

Funciones Asociadas

Parte de la sección Programación Orientada a Objetos del Journey de Rust de Coddy. Lección 4 de 61.

No todas las funciones de un bloque impl necesitan operar sobre una instancia existente. Las funciones que no reciben self como parámetro se denominan funciones asociadas: están asociadas con el tipo en sí, en lugar de con una instancia particular.

El uso más común de las funciones asociadas es crear constructores. Por convención, a menudo se denominan new:

struct Player {
    name: String,
    score: u32,
}

impl Player {
    fn new(name: String) -> Player {
        Player {
            name,
            score: 0,
        }
    }
}

Observa que no hay ningún parámetro self. Esta función no necesita un Player existente para funcionar. En su lugar, crea y devuelve uno completamente nuevo. El tipo de retorno es la propia estructura.

Para llamar a una función asociada, usa la sintaxis :: con el nombre del tipo en lugar de la notación de punto:

fn main() {
    let player1 = Player::new(String::from("Alice"));
    
    println!("{} starts with {} points", player1.name, player1.score);
    // Salida: Alice empieza con 0 puntos
}

Este patrón proporciona una forma clara de inicializar structs con valores predeterminados o lógica de validación, manteniendo la lógica de creación agrupada con la definición del tipo. Probablemente ya hayas visto esta sintaxis con String::from(): ¡también es una función asociada!

challenge icon

Desafío

Fácil

Crea una estructura Book con dos campos: title (String) y pages (u32).

Añade un bloque de implementación para Book con una función asociada llamada new que:

  • Acepte un parámetro title: String
  • Devuelva un nuevo Book con el título proporcionado y pages establecido en 0

Añade también un método llamado info que acepte &self y devuelva un String con el formato: "{title} has {pages} pages"

Recibirás una entrada:

  • El título del libro (String)

Usa la función asociada Book::new para crear un libro con el título proporcionado y, después, imprime el resultado de llamar al método info.

Formato de salida esperado:

{title} has {pages} pages

Pruébalo tú mismo

use std::io;

// TODO: Define la struct Book con los campos title (String) y pages (u32)


// TODO: Añade un bloque impl para Book con:
// - Una función asociada `new` que toma un title y devuelve un Book con pages establecido en 0
// - Un método `info` que devuelve un String en el formato "{title} has {pages} pages"


fn main() {
    let mut input = String::new();
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let title = input.trim().to_string();

    // TODO: Usa Book::new para crear un book con el title proporcionado
    // TODO: Imprime el resultado de llamar al método info
}
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