Menu
CoddyTech

按钮组件

本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 51 课,共 61 课。

challenge icon

挑战

简单

让我们继续构建文档系统,添加第二个 UI 组件:Button。和 TextField 一样,这个组件也会实现 Draw trait,展示不同类型如何共享一个通用接口。

你将为项目添加另一个模块文件:

  • draw.rs:保留你在之前的挑战中创建的 Draw trait。
  • text_field.rs:保留你的 TextField 结构体及其 Draw 实现。
  • button.rs:创建一个 Button 结构体,包含两个公共字段:label(类型为 String)和 width(类型为 u32)。为 Button 实现 Draw trait,这样调用 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 在线编译器