當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。