主要观点:与 Rust 语言新手交流时,常见误解是?
运算符只适用于Result
,实则它也适用于Option
,且是可用于任意类型的泛型短路运算符,只要这些类型实现了Try
trait。
关键信息:
?
运算符在 Rust 中并非只用于Result
,也可用于Option
,如fn maybe_double(v: Option<u32>) -> Option<u32> { Some(v? * 2) }
。- 要使用
Try
trait,需使用 nightly 编译器并激活相关特性,导入依赖use std::ops::{ControlFlow, FromResidual, Try};
。 - 实现
FromResidual
trait 很简单,只需包装值,如impl<T, E> FromResidual for OptionResult<T, E> { fn from_residual(residual: <Self as Try>::Residual) -> Self { Self::Err(residual) } }
。 - 实现
Try
trait 时需做决策,如impl<T, E> Try for OptionResult<T, E> { type Output = Option<T>; type Residual = E;... }
,其中Output
是继续执行时的解包类型,Residual
是短路类型。
重要细节: - 示例代码展示了如何使用
Try
trait 实现自定义类型OptionResult
,包括不同情况的处理。 - 文档中提到实现该 trait 还有其他细节,如推荐使用 newtype 作为残差以防止残差类型的意外交叉转换,且此 API 不稳定,可能会更改。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。