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


Rust From用法及代碼示例


本文簡要介紹rust語言中 Trait std::convert::From 的用法。

用法

pub trait From<T> {
    fn from(T) -> Self;
}

用於在使用輸入值時進行value-to-value 轉換。它是 Into 的倒數。

人們應該總是更喜歡實現From而不是 Into ,因為由於標準庫中的全麵實現,實現From會自動提供 Into 的實現。

僅在針對 Rust 1.41 之前的版本並轉換為當前 crate 之外的類型時才實現 Into 。由於 Rust 的孤立規則,From 在早期版本中無法進行這些類型的轉換。有關詳細信息,請參閱 Into

在泛型函數上指定特征邊界時,首選使用 Into 而不是使用 From。這樣,直接實現 Into 的類型也可以用作參數。

From 在執行錯誤處理時也非常有用。當構造一個可能失敗的函數時,返回類型通常采用 Result<T, E> 的形式。 From 特征允許函數返回封裝多個錯誤類型的單個錯誤類型,從而簡化了錯誤處理。有關更多詳細信息,請參閱“Examples” 部分和the book

注意:這個特質一定不能失敗.如果轉換可能失敗,請使用std::convert::TryFrom.

通用實現

  • From<T> for U 暗示 Into <U> for T
  • From 是自反的,也就是說實現了From<T> for T

例子

String 實現 From<&str>

&str 到 String 的顯式轉換如下完成:

let string = "hello".to_string();
let other_string = String::from("hello");

assert_eq!(string, other_string);

在執行錯誤處理時,為您自己的錯誤類型實現From 通常很有用。通過將底層錯誤類型轉換為我們自己的封裝底層錯誤類型的自定義錯誤類型,我們可以返回單個錯誤類型,而不會丟失有關底層原因的信息。 '?' 運算符通過調用在實現 From 時自動提供的 Into<CliError>::into 自動將底層錯誤類型轉換為我們的自定義錯誤類型。然後編譯器推斷應該使用Into 的哪個實現。

use std::fs;
use std::io;
use std::num;

enum CliError {
    IoError(io::Error),
    ParseError(num::ParseIntError),
}

impl From<io::Error> for CliError {
    fn from(error: io::Error) -> Self {
        CliError::IoError(error)
    }
}

impl From<num::ParseIntError> for CliError {
    fn from(error: num::ParseIntError) -> Self {
        CliError::ParseError(error)
    }
}

fn open_and_parse_file(file_name: &str) -> Result<i32, CliError> {
    let mut contents = fs::read_to_string(&file_name)?;
    let num: i32 = contents.trim().parse()?;
    Ok(num)
}

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Trait std::convert::From。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。