在Rust中,问号运算符(?)用于简化错误传播。当表达式返回Result或Option类型时,?会按以下方式工作:
- 对于
Result类型:
- 如果值是
Ok(T),则解包T并继续执行。 - 如果值是
Err(E),则提前从当前函数返回该错误(相当于将错误向上传播)。
- 对于
Option类型:
- 如果值是
Some(T),则解包T并继续执行。 - 如果值是
None,则提前从当前函数返回None。
示例代码分析
let tx = self.conn.transaction()?;self.conn.transaction():假设返回Result<Transaction, Error>类型。?的作用:
- 若结果为
Ok(Transaction),解包并赋值给tx。 - 若结果为
Err(Error),立即终止当前函数,返回该错误。
关键点
- 函数返回值要求:使用
?的函数必须返回Result或Option,以便兼容可能的错误提前返回。 - 与
try!宏的对比:?是语法糖,替代了旧的try!宏,使代码更简洁。 - 适用场景:适用于需要逐层传播错误的场景,避免手动使用
match或unwrap。
总结
问号运算符?通过自动解包成功值或传播错误/空值,简化了Rust中的错误处理逻辑,使代码更简洁且可读性更高。










