Repaso - Casillero seguro
Parte de la sección Object Oriented Programming del Journey de Rust de Coddy — lección 13 de 61.
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 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 inicial y el contenido - Un método
set_codeque permita cambiar el código del casillero - Un método
get_contentsque reciba un código de intento; si coincide con el código del casillero, devuelve el contenido; de lo contrario, devuelve"Access denied"
- Un constructor
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 coinsRecibirá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
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