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!
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:
- Tome un parámetro
title: String - Devuelva un nuevo
Bookcon el título dado ypagesestablecido en0
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} pagesHoja 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
}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