Repaso - Casillero seguro
Parte de la sección Programación Orientada a Objetos del Journey de Rust de Coddy. Lección 13 de 61.
Desafío
Fácil¡Construyamos un sistema de casillero seguro que reúna todo lo que has aprendido sobre la encapsulación! Tu casillero protegerá su contenido con 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 una estructuraLockercon dos campos privados:code(u32) ycontents(String). La estructura debe ser pública, pero ambos campos deben permanecer privados para proteger la seguridad del casillero. Implementa:- Un constructor
newque reciba un código y un contenido iniciales - Un método
set_codeque permita cambiar el código del casillero - Un método
get_contentsque reciba un código intentado; si coincide con el código del casillero, devuelve el contenido; de lo contrario, devuelve"Access denied"
- Un constructor
main.rs: Incorpora tu módulo del casillero, 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 sea correcto o el mensaje de denegación cuando sea incorrecto. Este es tu getter condicional 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", después intentas usar el código 0000, cambias el código a 5678 e intentas usar 5678, la salida sería:
Attempt with 0000: Access denied
Code changed
Attempt with 5678: Gold coinsRecibirás cinco entradas: el código inicial, el contenido, el primer código intentado, el nuevo código que se establecerá y el segundo código intentado.
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 Programación Orientada a Objetos
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 multimediaPractica por tu cuenta: Compilador de Rust online