rust - 如何习惯性地从 Option 转换导致?
问题描述
我是 Rust 新手!从 a 转换Option<T>
为 a的最佳方法是Result<T, ()>
什么?
TryFrom特征似乎很普遍并返回一个结果。流行的 num_traits 的NumCast有很多转换,但它们都返回一个Option<T>
. 类似地, Rust 标准库中的 NonZero* 构造函数(例如NonZeroI32)也是如此。然后我注意到 NumCast 实现了 a返回 an所以我想它可能有一种非标准的做事方式,但后来我看到了 NonZero* 实现并质疑了这个想法。from()
Option<T>
无论如何,从选项转换为结果似乎很频繁,我还没有找到一个很好的方法。例如:
/// Add common conversion from an i32 to a non-zero i32.
impl TryFrom<Container<i32>> for Container<NonZeroI32> {
type Error = ();
fn try_from(container: Container<i32>) -> Result<Self, ()> {
// NonZeroI32::new() returns an Option not a Result. Try a helper.
Ok(Self(option_to_result(NonZeroI32::new(container.0))?))
}
}
/// Helper function to convert from an Option to a Result (both types are
/// foreign and so is From).
fn option_to_result<T>(option: Option<T>) -> Result<T, ()> {
if let Some(some) = option {
Ok(some)
} else {
Err(())
}
}
/// Add another common conversion from an i32 to an i16.
impl TryFrom<Container<i32>> for Container<i16> {
type Error = ();
fn try_from(container: Container<i32>) -> Result<Self, ()> {
// NumCast::from() also returns an Option not a Result. Try map_or() instead
// of the helper.
Ok(Self(NumCast::from(container.0).map_or(Err(()), |x| Ok(x))?))
}
}
( Rust Playground中的上述示例。)
这些 NumCast、NonZero* 和 TryFrom 转换似乎很常见,但我的方法感觉很笨拙,就好像我将 Option 和 Result 类型相互竞争一样。我在这些转换中苦苦挣扎,也错过了Option
给定类型Result<T,()>
感觉相似的基本点。
那么,在 Rust 2018中转换Option<T>
为的惯用方式是什么?Result<T,()>
解决方案
推荐阅读
- reactjs - 在 React 应用程序中,前端是接收原始的 React 代码还是纯 html?
- javascript - 将 React/javascript 字符串对象数组转换为对象数组
- sql - 在同一个表中合并 SQL 查询
- visual-studio - 给定 URL,如何快速找到实现 API 调用的控制器和方法?
- networking - 为什么端口转发在我的网络中不起作用?
- css - 如何使用 css 将图像大小调整到其容器?
- android - 来自我的 xamarin 表单应用程序的 Localhost API 调用适用于模拟器,但不适用于我的 Android 设备
- python - 在 SQLAlchemy 中以原子方式插入/更新多个表中的行
- swift - 你可以在 Swift Playground 上使用 SwiftLint 吗?
- javascript - Nextjs | Why getInitialProps is not generating one page per result (SEO)?