673 字
3 分钟
Option & Result

核心定义
Option<T>
和 Result<T, E>
是 Rust 的安全枚举容器:
Option
表示值可能存在(Some(T)
)或不存在(None
),替代空指针Result
表示操作成功(Ok(T)
)或失败(Err(E)
),统一错误处理机制 二者均强制开发者显式处理所有情况,从编译器层面消除空指针异常和未处理错误。
工作原理
编译器要求通过 match
或组合子方法(如 unwrap_or
/map
)处理所有可能状态:
- 调用可能失败/返回空值的函数时,返回
Result
或Option
- 使用模式匹配或组合子明确处理成功/失败、有值/无值情况
- 未处理分支将导致编译错误
flowchart TD A[函数执行] --> B{是否成功?} B -->|是| C[返回 Some/Ok] B -->|否| D[返回 None/Err] C & D --> E{开发者处理} E --> F[match/组合子]
关键点
- 空值安全:
Option
强制处理值缺失情况,消除null
解引用 - 错误传播:
Result
的?
运算符自动向上传播错误 - 组合方法:
map
/and_then
/or_else
实现链式安全操作 - 解包控制:
unwrap()
快速获取值(生产代码慎用),expect()
添加错误信息 - 互转:
Option
可转Result
(ok_or()
),反之亦然
常见误区
- 滥用 unwrap:生产环境使用导致程序崩溃(应改用
match
或?
) - 嵌套忽略:未处理
Option<Result<T>>
的嵌套结构 - 错误类型混淆:
Result
中混用不同错误类型(应统一为枚举或 trait 对象) - None 处理遗漏:忽略
Option
的None
情况(如未实现Default
时用unwrap_or_default
) - 误用断言:在用户输入场景使用
assert!
代替Result
校验
应用场景
场景 | 示例 | 类型作用 |
---|---|---|
函数可能返回空值 | Vec::pop() -> Option<T> | 安全表示容器为空 |
I/O 操作错误处理 | File::open() -> Result<File, std::io::Error> | 封装操作错误细节 |
安全解构数据 | if let Some(email) = user.email { ... } | 避免空字段访问 |
链式操作 | `get_user().and_then( | u |
配置缺省值 | config.timeout.unwrap_or(30) | 优雅回退默认值 |
错误传播 | fn read_file() -> Result<String, io::Error> { ...? } | ? 自动返回错误 |
关联知识
- 模式匹配:
match
/if let
解构Option
和Result
的核心方式 - 错误处理 Traits:
std::error::Error
trait 统一错误类型接口 - 泛型编程:
Option<T>
/Result<T,E>
的泛型参数实现类型安全 - 迭代器适配器:
filter_map()
/flat_map()
处理容器中的Option/Result
- 单元测试:
Result
支持#[test] fn t() -> Result<(), String> { ... }
风格 - 类型转换:
From
trait 实现错误类型自动转换(?
的依赖机制)
💡 核心价值:
Option
和Result
将潜在错误编码进类型系统,通过编译时检查确保健壮性。优先使用组合子(map
/and_then
)和?
运算符构建清晰流程,生产代码避免unwrap()
。