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

Construyamos un sistema de locker seguro que reúna todo lo que has aprendido sobre la encapsulación. Tu Locker protegerá sus contents mediante un código secreto: solo alguien que conozca el código podrá ver qué hay dentro.

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

  • locker.rs: Define un Locker struct con dos private fields: code (u32) y contents (String). El struct debe ser public, pero ambos fields deben permanecer private para proteger la seguridad del Locker. Implementa:
    • Un new constructor que reciba un código initial y contents
    • Un set_code method que permita cambiar el código del Locker
    • Un get_contents method que reciba un código attempted; si coincide con el código del Locker, devuelve los contents; de lo contrario, devuelve "Access denied"
  • main.rs: Incorpora tu módulo Locker, crea un Locker y demuestra sus funciones de seguridad intentando acceder a los contents con códigos correctos e incorrectos.

El get_contents method debe devolver un String: los contents reales cuando el código es correcto o el mensaje de denegación cuando es incorrecto. Este es tu getter condicional que valida el acceso antes de revelar datos private.

Tu salida debe seguir exactamente este formato:

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

Por ejemplo, si creas un Locker con el código 1234 y los contents "Gold coins", después pruebas el código 0000, cambias el código a 5678 y pruebas 5678, la salida sería:

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

Recibirás cinco entradas: el código initial, los contents, el primer código attempted, el nuevo código que se establecerá y el segundo código attempted.

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: Crea un nuevo Locker con initial_code y contents

    // TODO: Intenta obtener contents con el código first_attempt
    // Imprime: "Attempt with {code}: {result}"

    // TODO: Cambia el código del locker a new_code
    // Print: "Code changed"

    // TODO: Intenta obtener contents con el código second_attempt
    // Imprime: "Attempt with {code}: {result}"
}

Todas las lecciones de Object Oriented Programming

Practica por tu cuenta: Compilador de Rust online