Rust 运算符与表达式
Rust 作为表达式语言的运算符、优先级直觉、块表达式与控制流产生值的基础。
#type / concept
#status / growing
#tech / dev
#resource / rust
[!info] 关联笔记
Rust 运算符与表达式
这个概念为什么出现
控制流与函数返回都建立在表达式之上:
- 算术/比较/逻辑如何组合?
- 为什么
if能出现在let右边? - 短路求值如何影响副作用?
- 类型不一致的运算为何直接拒绝?
[!abstract] 一句话理解 Rust 里绝大多数“能求值的结构”都是表达式;运算符按类型安全规则组合,逻辑与布尔短路,块与
if/match也能产生值。
最小可运行示例
场景:运费试算——满额包邮与偏远加价
电商结账要算运费:订单满 100 元(10000 分)包邮;否则基础运费 12 元;偏远地区再加 8 元。
用算术、比较、逻辑与 if 表达式一次算完。
// 业务意图:根据金额与是否偏远计算运费(分)。
// 教学点:比较/逻辑运算符;if 作为表达式赋值。
fn shipping_cents(subtotal_cents: u32, remote: bool) -> u32 {
let free_shipping = subtotal_cents >= 10_000;
// if 是表达式,两分支类型必须一致
let base: u32 = if free_shipping { 0 } else { 1_200 };
let remote_fee: u32 = if remote { 800 } else { 0 };
base + remote_fee
}
fn main() {
let fee = shipping_cents(8_000, true);
println!("shipping_cents={}", fee);
// 短路:左侧已能定结果时右侧不求值
let qty = 0;
let ok = qty > 0 && (10 / qty > 1); // 不会除零
println!("ok={}", ok);
}
建议运行:
cargo run
期望输出:
shipping_cents=2000
ok=false
结合场景再看三个关注点
- 分支类型一致:
if表达式两臂都要能变成同一类型。 - 钱用整数再运算,避免浮点运费。
- 短路保护无效状态上的昂贵/危险计算。
核心概念与准确模型
常见运算符族
| 族 | 例子 | 说明 |
|---|---|---|
| 算术 | + - * / % | 整数除法截断向零(注意业务) |
| 比较 | == != < > <= >= | 产生 bool |
| 逻辑 | && || ! | 短路 |
| 位运算 | & | ^ << >> | 整数位操作 |
| 赋值 | =、+=… | 赋值是语句性的用法;复合赋值要求 mut |
| 引用 | &、&mut | 借用,详见所有权章 |
表达式思维
let x = 1 + 2 * 3; // 算术表达式
let y = if x > 5 { 1 } else { 0 }; // 控制流表达式
let z = { let t = y + 1; t }; // 块表达式
类型安全
// let a: i32 = 1;
// let b: u32 = 2;
// let c = a + b; // 错误:类型不一致,需显式转换
let c = 1i32 + 2i32;
显式转换用 as 或更安全的 TryFrom(边界与截断需谨慎)。
边界情况与反直觉行为
- 整数除法:
7/2 == 3。 &&/||短路有副作用时要清醒。- 没有内建三元
? ::用if表达式。 - 自定义类型运算符靠 trait(
Add等),属进阶。
常见误区
[!warning] 常见误区:把 if 只当语句 错误理解:if 不能有值。
正确模型:if/match/块都能产生值。
为何易错:从语句主导语言迁来。
工程实践
- 复杂条件抽成命名布尔量,提升可读性。
- 金额/库存运算明确溢出策略。
- 优先表达式风格减少临时可变状态,但不为“炫技”牺牲清晰。
本节总结
- 运算符在类型安全下组合。
- 表达式语言使控制流可出现在赋值右侧。
- 短路与整除等细节有业务影响。
自测题
- 为什么
if true { 1 } else { "a" }不行? false && panic!()会不会 panic?
参考答案
- 两分支类型不一致。
- 不会,因短路不求值右侧。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| The Book — How Functions Work / Comments / Control Flow | 官方书 | 表达式与控制流 |
| Rust Reference — Operator expressions | 规范向 | 运算符细节 |