Menu
Coddy logo textTech

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.

challenge icon

Desafío

Fácil

Vamos 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 estructura Product con dos campos: name (String) y price (f64). Añade una función asociada llamada new que reciba un nombre y un precio y devuelva un nuevo Product. 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, trae Product al alcance con una sentencia use, 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.99

Recibirá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:

  • pub en el struct hace que el tipo sea visible
  • pub en los campos permite el acceso directo a los datos
  • pub en 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}
}
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