按钮组件
本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 51 课,共 61 课。
挑战
简单让我们继续构建文档系统,添加第二个 UI 组件:Button。和 TextField 一样,这个组件也会实现 Draw trait,展示不同类型如何共享一个通用接口。
你将为项目添加另一个模块文件:
draw.rs:保留你在之前的挑战中创建的Drawtrait。text_field.rs:保留你的TextField结构体及其Draw实现。button.rs:创建一个Button结构体,包含两个公共字段:label(类型为String)和width(类型为u32)。为Button实现Drawtrait,这样调用draw()时就会按以下格式打印按钮:Button: {label} (width: {width})main.rs:引入全部三个模块。分别创建一个TextField和一个Button,然后对它们分别调用draw(),以绘制这两个组件。
你的 button 模块需要使用 crate::draw::Draw 访问 Draw trait,就像你在 TextField 中所做的那样。
将提供以下输入:
- 第一行:文本字段的内容
- 第二行:按钮的标签
- 第三行:按钮的宽度(数字)
你的输出应先显示文本字段,再显示按钮,每个各占一行:
Text: Welcome
Button: Submit (width: 100)亲手试试
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:用 `label` 和 `width` 创建一个 Button,然后调用 draw()
}面向对象编程中的所有课
自己练习: Rust 在线编译器