Trait std::convert::TryFrom1.34.0[][src]

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

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

当您进行的类型转换可能会成功完成但可能还需要特殊处理时,这很有用。 例如,无法使用 From trait 将 i64 转换为 i32,因为 i64 可能包含 i32 无法表示的值,因此转换将丢失数据。

这可以通过将 i64 截断为 i32 (本质上给 i64 的值取 i32::MAX 模) 或通过简单地返回 i32::MAX 或其他方法来处理。 From trait 用于完美的转换,因此 TryFrom trait 会通知程序员类型转换何时会变差,并让他们决定如何处理它。

泛型实现

  • 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))
        }
    }
}
Run

Examples

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

use std::convert::TryFrom;

let big_number = 1_000_000_000_000i64;
// 默默地截断 `big_number`,事实之后需要检测并处理该截断。
let smaller_number = big_number as i32;
assert_eq!(smaller_number, -727379968);

// 由于 `big_number` 太大而无法容纳在 `i32` 中,因此返回错误。
let try_smaller_number = i32::try_from(big_number);
assert!(try_smaller_number.is_err());

// 返回 `Ok(3)`。
let try_successful_smaller_number = i32::try_from(3);
assert!(try_successful_smaller_number.is_ok());
Run

Associated Types

发生转换错误时返回的类型。

Required methods

执行转换。

Implementors

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

Attempts to convert i8 to NonZeroI8.

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

Attempts to convert i16 to NonZeroI16.

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

Attempts to convert i32 to NonZeroI32.

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

Attempts to convert i64 to NonZeroI64.

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

Attempts to convert i128 to NonZeroI128.

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

Attempts to convert isize to NonZeroIsize.

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

Attempts to convert u8 to NonZeroU8.

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

Attempts to convert u16 to NonZeroU16.

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

Attempts to convert u32 to NonZeroU32.

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

Attempts to convert u64 to NonZeroU64.

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

Attempts to convert u128 to NonZeroU128.

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

尝试从源号码类型创建目标号码类型。 如果源值超出目标类型的范围,则返回错误。

Attempts to convert usize to NonZeroUsize.

Attempts to convert NonZeroI8 to NonZeroU8.

Attempts to convert NonZeroI8 to NonZeroU16.

Attempts to convert NonZeroI8 to NonZeroU32.

Attempts to convert NonZeroI8 to NonZeroU64.

Attempts to convert NonZeroI8 to NonZeroU128.

Attempts to convert NonZeroI8 to NonZeroUsize.

Attempts to convert NonZeroI16 to NonZeroI8.

Attempts to convert NonZeroI16 to NonZeroU8.

Attempts to convert NonZeroI16 to NonZeroU16.

Attempts to convert NonZeroI16 to NonZeroU32.

Attempts to convert NonZeroI16 to NonZeroU64.

Attempts to convert NonZeroI16 to NonZeroU128.

Attempts to convert NonZeroI16 to NonZeroUsize.

Attempts to convert NonZeroI32 to NonZeroI8.

Attempts to convert NonZeroI32 to NonZeroI16.

Attempts to convert NonZeroI32 to NonZeroIsize.

Attempts to convert NonZeroI32 to NonZeroU8.

Attempts to convert NonZeroI32 to NonZeroU16.

Attempts to convert NonZeroI32 to NonZeroU32.

Attempts to convert NonZeroI32 to NonZeroU64.

Attempts to convert NonZeroI32 to NonZeroU128.

Attempts to convert NonZeroI32 to NonZeroUsize.

Attempts to convert NonZeroI64 to NonZeroI8.

Attempts to convert NonZeroI64 to NonZeroI16.

Attempts to convert NonZeroI64 to NonZeroI32.

Attempts to convert NonZeroI64 to NonZeroIsize.

Attempts to convert NonZeroI64 to NonZeroU8.

Attempts to convert NonZeroI64 to NonZeroU16.

Attempts to convert NonZeroI64 to NonZeroU32.

Attempts to convert NonZeroI64 to NonZeroU64.

Attempts to convert NonZeroI64 to NonZeroU128.

Attempts to convert NonZeroI64 to NonZeroUsize.

Attempts to convert NonZeroI128 to NonZeroI8.

Attempts to convert NonZeroI128 to NonZeroI16.

Attempts to convert NonZeroI128 to NonZeroI32.

Attempts to convert NonZeroI128 to NonZeroI64.

Attempts to convert NonZeroI128 to NonZeroIsize.

Attempts to convert NonZeroI128 to NonZeroU8.

Attempts to convert NonZeroI128 to NonZeroU16.

Attempts to convert NonZeroI128 to NonZeroU32.

Attempts to convert NonZeroI128 to NonZeroU64.

Attempts to convert NonZeroI128 to NonZeroU128.

Attempts to convert NonZeroI128 to NonZeroUsize.

Attempts to convert NonZeroIsize to NonZeroI8.

Attempts to convert NonZeroIsize to NonZeroI16.

Attempts to convert NonZeroIsize to NonZeroI32.

Attempts to convert NonZeroIsize to NonZeroI64.

Attempts to convert NonZeroIsize to NonZeroI128.

Attempts to convert NonZeroIsize to NonZeroU8.

Attempts to convert NonZeroIsize to NonZeroU16.

Attempts to convert NonZeroIsize to NonZeroU32.

Attempts to convert NonZeroIsize to NonZeroU64.

Attempts to convert NonZeroIsize to NonZeroU128.

Attempts to convert NonZeroIsize to NonZeroUsize.

Attempts to convert NonZeroU8 to NonZeroI8.

Attempts to convert NonZeroU16 to NonZeroI8.

Attempts to convert NonZeroU16 to NonZeroI16.

Attempts to convert NonZeroU16 to NonZeroIsize.

Attempts to convert NonZeroU16 to NonZeroU8.

Attempts to convert NonZeroU32 to NonZeroI8.

Attempts to convert NonZeroU32 to NonZeroI16.

Attempts to convert NonZeroU32 to NonZeroI32.

Attempts to convert NonZeroU32 to NonZeroIsize.

Attempts to convert NonZeroU32 to NonZeroU8.

Attempts to convert NonZeroU32 to NonZeroU16.

Attempts to convert NonZeroU32 to NonZeroUsize.

Attempts to convert NonZeroU64 to NonZeroI8.

Attempts to convert NonZeroU64 to NonZeroI16.

Attempts to convert NonZeroU64 to NonZeroI32.

Attempts to convert NonZeroU64 to NonZeroI64.

Attempts to convert NonZeroU64 to NonZeroIsize.

Attempts to convert NonZeroU64 to NonZeroU8.

Attempts to convert NonZeroU64 to NonZeroU16.

Attempts to convert NonZeroU64 to NonZeroU32.

Attempts to convert NonZeroU64 to NonZeroUsize.

Attempts to convert NonZeroU128 to NonZeroI8.

Attempts to convert NonZeroU128 to NonZeroI16.

Attempts to convert NonZeroU128 to NonZeroI32.

Attempts to convert NonZeroU128 to NonZeroI64.

Attempts to convert NonZeroU128 to NonZeroI128.

Attempts to convert NonZeroU128 to NonZeroIsize.

Attempts to convert NonZeroU128 to NonZeroU8.

Attempts to convert NonZeroU128 to NonZeroU16.

Attempts to convert NonZeroU128 to NonZeroU32.

Attempts to convert NonZeroU128 to NonZeroU64.

Attempts to convert NonZeroU128 to NonZeroUsize.

Attempts to convert NonZeroUsize to NonZeroI8.

Attempts to convert NonZeroUsize to NonZeroI16.

Attempts to convert NonZeroUsize to NonZeroI32.

Attempts to convert NonZeroUsize to NonZeroI64.

Attempts to convert NonZeroUsize to NonZeroI128.

Attempts to convert NonZeroUsize to NonZeroIsize.

Attempts to convert NonZeroUsize to NonZeroU8.

Attempts to convert NonZeroUsize to NonZeroU16.

Attempts to convert NonZeroUsize to NonZeroU32.

Attempts to convert NonZeroUsize to NonZeroU64.

Attempts to convert NonZeroUsize to NonZeroU128.

如果 Vec<T> 的大小与请求的数组的大小完全匹配,则以数组的形式获取 Vec<T> 的全部内容。

Examples

use std::convert::TryInto;
assert_eq!(vec![1, 2, 3].try_into(), Ok([1, 2, 3]));
assert_eq!(<Vec<i32>>::new().try_into(), Ok([]));
Run

如果长度不匹配,则输入以 Err 返回:

use std::convert::TryInto;
let r: Result<[i32; 4], _> = (0..10).collect::<Vec<_>>().try_into();
assert_eq!(r, Err(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]));
Run

如果只需要获得 Vec<T> 的前缀就可以了,您可以先调用 .truncate(N)

use std::convert::TryInto;
let mut v = String::from("hello world").into_bytes();
v.sort();
v.truncate(2);
let [a, b]: [_; 2] = v.try_into().unwrap();
assert_eq!(a, b' ');
assert_eq!(b, b'd');
Run