673 字
3 分钟
Option & Result

核心定义#

Option<T>Result<T, E> 是 Rust 的安全枚举容器

  • Option 表示值可能存在(Some(T))或不存在(None),替代空指针
  • Result 表示操作成功(Ok(T))或失败(Err(E)),统一错误处理机制 二者均强制开发者显式处理所有情况,从编译器层面消除空指针异常和未处理错误。

工作原理#

编译器要求通过 match 或组合子方法(如 unwrap_or/map)处理所有可能状态:

  1. 调用可能失败/返回空值的函数时,返回 Result 或 Option
  2. 使用模式匹配或组合子明确处理成功/失败、有值/无值情况
  3. 未处理分支将导致编译错误
flowchart TD 
	A[函数执行] --> B{是否成功?} 
	B -->|是| C[返回 Some/Ok] 
	B -->|否| D[返回 None/Err] 
	C & D --> E{开发者处理} 
	E --> F[match/组合子]

关键点#

  1. 空值安全Option 强制处理值缺失情况,消除 null 解引用
  2. 错误传播Result 的 ? 运算符自动向上传播错误
  3. 组合方法map/and_then/or_else 实现链式安全操作
  4. 解包控制unwrap() 快速获取值(生产代码慎用),expect() 添加错误信息
  5. 互转Option 可转 Resultok_or()),反之亦然

常见误区#

  1. 滥用 unwrap:生产环境使用导致程序崩溃(应改用 match 或 ?
  2. 嵌套忽略:未处理 Option<Result<T>> 的嵌套结构
  3. 错误类型混淆Result 中混用不同错误类型(应统一为枚举或 trait 对象)
  4. None 处理遗漏:忽略 Option 的 None 情况(如未实现 Default 时用 unwrap_or_default
  5. 误用断言:在用户输入场景使用 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> { ...? }? 自动返回错误

关联知识#

  1. 模式匹配match/if let 解构 Option 和 Result 的核心方式
  2. 错误处理 Traitsstd::error::Error trait 统一错误类型接口
  3. 泛型编程Option<T>/Result<T,E> 的泛型参数实现类型安全
  4. 迭代器适配器filter_map()/flat_map() 处理容器中的 Option/Result
  5. 单元测试Result 支持 #[test] fn t() -> Result<(), String> { ... } 风格
  6. 类型转换From trait 实现错误类型自动转换(? 的依赖机制)

💡 核心价值OptionResult 将潜在错误编码进类型系统,通过编译时检查确保健壮性。优先使用组合子(map/and_then)和 ? 运算符构建清晰流程,生产代码避免 unwrap()

Option & Result
https://website-truelovings-projects.vercel.app/posts/rust/option--result/
作者
欢迎来到StarSky的网站!
发布于
2025-08-15
许可协议
CC BY-NC-SA 4.0