当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust TryFrom用法及代码示例


本文简要介绍rust语言中 Trait std::convert::TryFrom 的用法。

用法

pub trait TryFrom<T> {
    type Error;
    fn try_from(value: T) -> Result<Self, Self::Error>;
}

在某些情况下,可能会以受控方式失败的简单且安全的类型转换。它是 TryInto 的倒数。

当您正在进行可能会成功但也可能需要特殊处理的类型转换时,这非常有用。例如,无法使用 From 特征将 i64 转换为 i32 ,因为 i64 可能包含 i32 无法表示的值,因此转换会丢失数据。这可以通过将 i64 截断为 i32 (本质上是给 i64 的值模 i32::MAX )或简单地返回 i32::MAX 或通过某种其他方法来处理。 From 特性旨在实现完美转换,因此 TryFrom 特性会在类型转换可能出错时通知程序员,并让他们决定如何处理它。

通用实现

  • TryFrom<T> for U 暗示 TryInto <U> for T
  • try_from 是自反的,这意味着 TryFrom<T> for T 已实现并且不会失败 - 用于在 T 类型的值上调用 T::try_from() 的关联 Error 类型是 Infallible 。当 ! 类型稳定时, Infallible ! 将等效。

TryFrom<T>可以如下实现:

use std::convert::TryFrom;

struct GreaterThanZero(i32);

impl TryFrom<i32> for GreaterThanZero {
    type Error = &'static str;

    fn try_from(value: i32) -> Result<Self, Self::Error> {
        if value <= 0 {
            Err("GreaterThanZero only accepts value superior than zero!")
        } else {
            Ok(GreaterThanZero(value))
        }
    }
}

例子

如上所述, i32 实现 TryFrom< i64 >

use std::convert::TryFrom;

let big_number = 1_000_000_000_000i64;
// Silently truncates `big_number`, requires detecting
// and handling the truncation after the fact.
let smaller_number = big_number as i32;
assert_eq!(smaller_number, -727379968);

// Returns an error because `big_number` is too big to
// fit in an `i32`.
let try_smaller_number = i32::try_from(big_number);
assert!(try_smaller_number.is_err());

// Returns `Ok(3)`.
let try_successful_smaller_number = i32::try_from(3);
assert!(try_successful_smaller_number.is_ok());

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait std::convert::TryFrom。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。