Rust 学习笔记 24:模式匹配详情 (Pattern Matching)

Rust 学习笔记 24:模式匹配详情 (Pattern Matching) “Patterns are the ultimate way to deconstruct reality.” 我们在前面的章节已经频繁使用了 match 和 let。其实,模式 (Pattern) 在 Rust 中无处不在。 只要涉及到数据赋值或参数传递,几乎都有模式的身影。 1. 模式无处不在 除了 match 表达式,哪里还有模式? if let: 1if let Some(x) = option_value { ... } while let: 1while let Some(top) = stack.pop() { ... } for 循环: 1for (index, value) in v.iter().enumerate() { ... } let 语句: 1let (x, y, z) = (1, 2, 3); 函数参数: 1fn print_coordinates(&(x, y): &(i32, i32)) { ... } 2. Refutability (可反驳性) 模式分为两类: ...

2026-03-30 · 2 min · 316 words · 老墨

Rust 学习笔记 10:项目实战一:猜数字

Rust 学习笔记 10:项目实战一:猜数字 “Programming is not about typing, it’s about thinking.” 之前的 9 篇笔记,我们一直在抠语法细节。 今天是圣诞节(假设),我们来点轻松的:用 Rust 写一个猜数字游戏。 规则很简单: 程序生成一个 1~100 的随机数。 玩家输入猜测。 程序提示 “大了”、“小了” 或 “猜对了”。 猜对了游戏结束,否则继续。 1. 引入依赖 Crates Rust 的标准库很精简,没有内置随机数生成。我们需要引入第三方库 rand。 修改 Cargo.toml: 1[dependencies] 2rand = "0.9" 这和 Go 的 go get 不太一样,Rust 更像是 Node.js 的 npm,依赖管理非常现代化。 2. 获取用户输入 1use std::io; 2 3let mut guess = String::new(); // 创建可变空字符串 4 5io::stdin() 6 .read_line(&mut guess) // 传可变引用进去修改 7 .expect("Failed to read line"); // 处理 Result::Err 注意那个 read_line 返回的是 io::Result 枚举。如果读取失败,它会返回 Err,expect 方法会帮你 panic 并打印错误信息。在 Rust 中,忽略返回值是会被警告的。 ...

2024-12-25 · 2 min · 239 words · 老墨

Rust 学习笔记 09:枚举与模式匹配

Rust 学习笔记 09:枚举与模式匹配 “Null References: The Billion Dollar Mistake.” – Tony Hoare Go 语言没有枚举(只有 iota 常量),也没有代数数据类型,更没有模式匹配。所以这一章对于 Go 开发者来说,是全新的世界。 1. 它是枚举,但又不仅仅是枚举 在 C/Go 中,Enum 通常只是整数的别名。 但在 Rust 中,Enum 可以携带数据,而且每个变体携带的数据类型可以不同。 1enum Message { 2 Quit, // 没有数据 3 Move { x: i32, y: i32 }, // 包含匿名结构体 4 Write(String), // 包含 String 5 ChangeColor(i32, i32, i32), // 包含元组 6} 这一个 Enum 类型,就涵盖了消息系统的所有可能性。这比 Go 中定义一堆 struct 加上 interface 要简洁直观得多。 2. Option 枚举:告别 Null Rust 没有 null。 那我想要表达"变量可能为空"怎么办? Rust 标准库提供了一个枚举 Option<T>: ...

2024-11-30 · 2 min · 224 words · 老墨