Componente de botón
Parte de la sección Programación Orientada a Objetos del Journey de Rust de Coddy. Lección 51 de 61.
Desafío
FácilContinuemos creando nuestro sistema de documentos al añadir un segundo componente de UI: un Button. Al igual que TextField, este componente implementará el trait Draw, demostrando cómo distintos tipos pueden compartir una interfaz común.
Ampliarás tu proyecto con otro archivo de módulo:
draw.rs: Conserva tu traitDrawde los desafíos anteriores.text_field.rs: Conserva tu estructuraTextFieldy su implementación deDraw.button.rs: Crea una estructuraButtoncon dos campos públicos:label(unString) ywidthunu32). Implementa el traitDrawparaButtonde modo que llamar adraw()muestre el botón con este formato:Button: {label} (width: {width})main.rs: Incluye los tres módulos. Crea tanto unTextFieldcomo unButtony, después, llama adraw()en cada uno para renderizar ambos componentes.
Tu módulo button deberá acceder al trait Draw mediante crate::draw::Draw, tal como hiciste con TextField.
Se proporcionarán las siguientes entradas:
- Primera línea: el contenido del campo de texto
- Segunda línea: la etiqueta del botón
- Tercera línea: el ancho del botón (como número)
Tu salida deberá mostrar primero el campo de texto y después el botón, cada uno en su propia línea:
Text: Welcome
Button: Submit (width: 100)Pruébalo tú mismo
mod draw;
mod text_field;
mod button;
use draw::Draw;
use text_field::TextField;
use button::Button;
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");
let text_field = TextField { content };
text_field.draw();
// TODO: Crear un Button con `label` y `width`, luego llamar a draw()
}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