上一章
CH.044 小时实战: 图形面积计算器

结构体、枚举与模式匹配

Rust 的数据建模利器

结构体:数据 + 行为的组合

对比:数据建模
JS
TypeScript
interface User {
username: string;
email: string;
age: number;
}

class UserService {
static create(username: string, email: string): User {
  return { username, email, age: 0 };
}

greet(user: User): string {
  return `你好,${user.username}`;
}
}
Rs
Rust
struct User {
  username: String,
  email:    String,
  age:      u32,
}

impl User {
  // 关联函数(静态方法)
  fn new(username: String, email: String) -> User {
      User { username, email, age: 0 }
  }
  
  // 方法(有 &self 参数)
  fn greet(&self) -> String {
      format!("你好,{}", self.username)
  }
}

Rust 明确分离数据(struct)和行为(impl),没有继承,但有组合和 Trait 实现。


枚举:代数数据类型

Rust 的 enum 远比其他语言强大——每个变体可以携带不同类型的数据:

enum Shape {
    Circle(f64),                            // 半径
    Rectangle(f64, f64),                    // 宽 × 高
    Triangle { base: f64, height: f64 },    // 命名字段
}
 
impl Shape {
    fn area(&self) -> f64 {
        match self {
            Shape::Circle(r)              => std::f64::consts::PI * r * r,
            Shape::Rectangle(w, h)        => w * h,
            Shape::Triangle { base, height } => base * height / 2.0,
        }
    }
}

Option:消灭 null

// 不再有 undefined is not a function
fn find_user(id: u32) -> Option<User> {
    if id == 1 { Some(User::new("Alice".into(), "a@b.com".into())) }
    else { None }
}
 
// 强制处理两种情况
match find_user(1) {
    Some(user) => println!("{}", user.greet()),
    None       => println!("用户不存在"),
}
 
// 简洁写法
if let Some(user) = find_user(1) {
    println!("{}", user.greet());
}
 
// 链式操作
let name = find_user(1)
    .map(|u| u.username)
    .unwrap_or("匿名".to_string());

Option 强制你处理"无值"的情况——编译器不让你忽略 None。这是 Rust 比 JavaScript 更安全的根本原因之一。


模式匹配的威力

match 是穷举的——你必须处理所有情况,否则编译失败:

let number = 7;
let text = match number {
    1        => "一",
    2..=5    => "二到五",
    6 | 7    => "六或七",
    n @ 8..= => { println!("大数 {}", n); "大于七" },
    _        => "其他",
};

穷举的威力:当你的枚举新增一个变体,所有 match 都会报编译错误,提醒你处理新情况。TypeScript 的 switch 做不到这一点。


实战项目:图形面积计算器

实战项目

图形面积计算器

45 分钟初级

定义 Shape 枚举,实现面积和周长计算,从命令行读取图形参数,用模式匹配分发逻辑。

enum 定义和实现match 解构impl 方法命令行参数解析
cargo new geometry && cd geometry

实战视频

结构体、枚举与模式匹配
20 分钟精讲
0:00 / 0:00
CC
Option 替代 null、match 穷举检查、枚举携带数据的代数类型思维。