La palabra clave Public
Parte de la sección Object Oriented Programming del Journey de Rust de Coddy — lección 9 de 61.
En la lección anterior, aprendiste a organizar el código en archivos de módulos separados. Sin embargo, si intentaras usar el Player struct de main.rs, te encontrarías con un error del compilador. Esto se debe a que todo en un módulo de Rust es privado por defecto.
Para hacer que los elementos sean accesibles desde fuera de su módulo, debes marcarlos explícitamente con la palabra clave pub:
// player.rs
pub struct Player {
pub name: String,
pub score: u32,
}
impl Player {
pub fn new(name: String) -> Player {
Player { name, score: 0 }
}
}
Observa cómo pub aparece en varios lugares: en la propia estructura, en cada campo y en el método. Cada elemento necesita su propia declaración de visibilidad.
Sin pub en el struct, otros archivos ni siquiera pueden nombrar el tipo. Sin pub en los campos, no pueden acceder a los datos directamente. Sin pub en los métodos, no pueden llamarlos.
Ahora en main.rs, puedes usar los elementos públicos del módulo:
// main.rs
mod player;
use player::Player;
fn main() {
let p = Player::new(String::from("Alice"));
println!("{}", p.name);
}
La sentencia use trae a Player al ámbito para que no tengas que escribir player::Player cada vez. Este enfoque de privacidad por defecto es intencional: te anima a pensar detenidamente qué partes de tu código deben estar expuestas al mundo exterior.
Desafío
FácilVamos a construir un catálogo de productos sencillo organizando tu código en dos archivos y haciendo que los elementos correctos sean públicos para que puedan ser utilizados desde tu programa principal.
Crearás dos archivos:
product.rs: Define una estructuraProductcon dos campos:name(String) yprice(f64). Añade una función asociada llamadanewque reciba un nombre y un precio y devuelva un nuevoProduct. Recuerda marcar la estructura, sus campos y el método como públicos para que puedan ser accedidos desde fuera del módulo.main.rs: Declara el módulo product, traeProductal alcance con una sentenciause, luego crea un producto e imprime sus detalles.
Piensa detenidamente dónde necesitas la palabra clave pub: la estructura en sí debe ser visible, los campos deben ser accesibles para lectura y el método constructor debe poder ser llamado desde main.rs.
Tu salida debe seguir este formato exacto:
Product: {name}, Price: ${price}Por ejemplo, si creas un producto con el nombre "Laptop" y el precio 999.99, la salida sería:
Product: Laptop, Price: $999.99Recibirás dos entradas: el nombre del producto y el precio.
Hoja de referencia
En Rust, todo en un módulo es privado por defecto. Para hacer que los elementos sean accesibles desde fuera de su módulo, utiliza la palabra clave pub.
Marca structs, campos y métodos como públicos:
// player.rs
pub struct Player {
pub name: String,
pub score: u32,
}
impl Player {
pub fn new(name: String) -> Player {
Player { name, score: 0 }
}
}
Cada elemento necesita su propia declaración de visibilidad:
puben el struct hace que el tipo sea visiblepuben los campos permite el acceso directo a los datospuben los métodos permite llamarlos
Utiliza la sentencia use para traer elementos al alcance (scope):
// main.rs
mod player;
use player::Player;
fn main() {
let p = Player::new(String::from("Alice"));
println!("{}", p.name);
}
Pruébalo tú mismo
// Declara el módulo product
mod product;
// TODO: Trae Product al alcance con una sentencia use
fn main() {
// Lee la entrada
let mut name = String::new();
std::io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
let mut price_input = String::new();
std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
let price: f64 = price_input.trim().parse().expect("Failed to parse price");
// TODO: Crea un nuevo Product usando la función Product::new
// TODO: Imprime los detalles del producto en el formato:
// Product: {name}, Price: ${price}
}
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