Menu
Coddy logo textTech

Funciones Asociadas

Parte de la sección Object Oriented Programming del Journey de Rust de Coddy — lección 4 de 61.

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

El uso más común de las funciones asociadas es la creación de constructores. Por convención, estas suelen llamarse 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 el propio struct.

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

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

Este patrón proporciona una forma limpia de inicializar structs con valores por defecto o lógica de validación, manteniendo la lógica de creación agrupada con la definición del tipo. Es probable que ya hayas visto esta sintaxis con String::from(); ¡eso 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:

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

También añade un método llamado info que tome &self y devuelva un String en 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, luego imprime el resultado de llamar al método info.

Formato de salida esperado:

{title} has {pages} pages

Hoja de referencia

Las funciones en un bloque impl que no toman self como parámetro se denominan funciones asociadas. Están asociadas con el tipo en sí mismo en lugar de con cualquier instancia particular.

Las funciones asociadas se utilizan comúnmente como constructores, típicamente llamados new:

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

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

Para llamar a una función asociada, utiliza la sintaxis :: con el nombre del tipo:

let player1 = Player::new(String::from("Alice"));

String::from() es un ejemplo de una función asociada que ya has utilizado.

Pruébalo tú mismo

use std::io;

// TODO: Definir la estructura Book con los campos title (String) y pages (u32)


// TODO: Añadir un bloque impl para Book con:
// - Una función asociada `new` que tome un título y devuelva un Book con las páginas establecidas en 0
// - Un método `info` que devuelva 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: Usar Book::new para crear un libro con el título proporcionado
    // TODO: Imprimir 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 Object Oriented Programming