El Struct Screen
Parte de la sección Object Oriented Programming del Journey de Rust de Coddy — lección 52 de 61.
Desafío
Fácil¡Ahora es el momento de reunir todos tus componentes de UI! Crearás una estructura Screen que pueda contener una colección de diferentes componentes dibujables utilizando objetos de rasgo (trait objects). Aquí es donde el poder de Vec<Box<dyn Draw>> realmente brilla: una sola colección que gestiona múltiples tipos de componentes.
Añadirás un nuevo módulo a tu proyecto en crecimiento:
draw.rs: Tu rasgoDrawde los desafíos anteriores.text_field.rs: Tu componenteTextFieldque imprime"Text: {}".button.rs: Tu componenteButtonque imprime"Button: {} (width: {})".screen.rs: Crea una estructuraScreenque contenga un campo públicocomponentsde tipoVec<Box<dyn Draw>>. Implementa una función asociadanewque cree una pantalla vacía, y un métodoaddque reciba unBox<dyn Draw>y lo añada al vector de componentes.main.rs: Reúne todos los módulos. Crea unaScreen, añádele unTextFieldy unButton, luego itera a través de los componentes de la pantalla y llama adraw()en cada uno.
Tu Screen necesita almacenar objetos de rasgo, por lo que usarás la palabra clave dyn con tu rasgo Draw. El método add debe recibir &mut self ya que modifica el vector de componentes.
Se proporcionarán las siguientes entradas:
- Primera línea: el contenido del campo de texto (content)
- Segunda línea: la etiqueta del botón (label)
- Tercera línea: el ancho del botón (width, como número)
Tu salida debe mostrar cada componente en su propia línea, en el orden en que fueron añadidos:
Text: Hello
Button: Click Me (width: 80)Pruébalo tú mismo
mod draw;
mod text_field;
mod button;
mod screen;
use draw::Draw;
use text_field::TextField;
use button::Button;
use screen::Screen;
pub struct Label {
pub text: String,
}
impl Draw for Label {
fn draw(&self) {
println!("{}", self.text);
}
}
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let content = input1.trim().to_string();
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let label = input2.trim().to_string();
let mut input3 = String::new();
std::io::stdin().read_line(&mut input3).expect("Failed to read line");
let width: u32 = input3.trim().parse().expect("Failed to parse width");
// TODO: Crear un Screen usando Screen::new()
// TODO: Añadir un TextField envuelto en Box::new() a la pantalla
// TODO: Añadir un Button envuelto en Box::new() a la pantalla
// TODO: Iterar sobre screen.components y llamar a draw() en cada componente
}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