在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中的错误处理逻辑,使代码更简洁且可读性更高。