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!
Desafío
FácilCrea 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
Bookcon el título proporcionado ypagesestablecido en0
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} pagesPrué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
}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