Menu
Coddy logo textTech

Repaso - Casillero seguro

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

challenge icon

Desafío

Fácil

¡Vamos a construir un sistema de casillero seguro que reúna todo lo que has aprendido sobre la encapsulación! Tu casillero protegerá su contenido tras un código secreto; solo alguien que conozca el código podrá ver lo que hay dentro.

Crearás dos archivos para organizar tu código:

  • locker.rs: Define una estructura Locker con dos campos privados: code (u32) y contents (String). La estructura debe ser pública, pero ambos campos deben permanecer privados para proteger la seguridad del casillero. Implementa:
    • Un constructor new que reciba un código inicial y el contenido
    • Un método set_code que permita cambiar el código del casillero
    • Un método get_contents que reciba un código de intento; si coincide con el código del casillero, devuelve el contenido; de lo contrario, devuelve "Access denied"
  • main.rs: Importa tu módulo locker, crea un casillero y demuestra sus funciones de seguridad intentando acceder al contenido con códigos correctos e incorrectos.

El método get_contents debe devolver un String, ya sea el contenido real cuando el código es correcto, o el mensaje de denegación cuando es incorrecto. Este es tu captador condicional (getter) que valida el acceso antes de revelar datos privados.

Tu salida debe seguir este formato exacto:

Attempt with {code}: {result}
Code changed
Attempt with {code}: {result}

Por ejemplo, si creas un casillero con el código 1234 y el contenido "Gold coins", luego intentas el código 0000, cambias el código a 5678 e intentas 5678, la salida sería:

Attempt with 0000: Access denied
Code changed
Attempt with 5678: Gold coins

Recibirás cinco entradas: el código inicial, el contenido, el código del primer intento, el nuevo código a establecer y el código del segundo intento.

Pruébalo tú mismo

mod locker;

use locker::Locker;

fn main() {
    // Leer entradas
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let initial_code: u32 = input.trim().parse().expect("Invalid number");

    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let contents = input.trim().to_string();

    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let first_attempt: u32 = input.trim().parse().expect("Invalid number");

    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let new_code: u32 = input.trim().parse().expect("Invalid number");

    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let second_attempt: u32 = input.trim().parse().expect("Invalid number");

    // TODO: Crear un nuevo Locker con initial_code y contents

    // TODO: Intentar obtener el contenido con el código first_attempt
    // Imprimir: "Attempt with {code}: {result}"

    // TODO: Cambiar el código del locker a new_code
    // Imprimir: "Code changed"

    // TODO: Intentar obtener el contenido con el código second_attempt
    // Imprimir: "Attempt with {code}: {result}"
}

Todas las lecciones de Object Oriented Programming