揭开 Rust 的?运算符的神秘面纱

主要观点:与 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 不稳定,可能会更改。
阅读 17
0 条评论