结构体:数据 + 行为的组合
对比:数据建模
JS
TypeScriptinterface 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
Ruststruct 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实战视频
结构体、枚举与模式匹配
0:00 / 0:00CC
Option 替代 null、match 穷举检查、枚举携带数据的代数类型思维。