本文簡要介紹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 FromUtf16Error用法及代碼示例
- Rust FromUtf8Error.as_bytes用法及代碼示例
- Rust FromVecWithNulError.into_bytes用法及代碼示例
- Rust FromBytesWithNulError用法及代碼示例
- Rust FromResidual.from_residual用法及代碼示例
- Rust FromUtf8Error.into_bytes用法及代碼示例
- Rust FromSecsError用法及代碼示例
- Rust FromUtf8Error用法及代碼示例
- Rust FromUtf8Error.utf8_error用法及代碼示例
- Rust FromVecWithNulError用法及代碼示例
- Rust FromRawFd.from_raw_fd用法及代碼示例
- Rust FromIterator用法及代碼示例
- Rust FromStr.from_str用法及代碼示例
- Rust FromStr用法及代碼示例
- Rust FromVecWithNulError.as_bytes用法及代碼示例
- Rust FromIterator.from_iter用法及代碼示例
- Rust Formatter.precision用法及代碼示例
- Rust Formatter.debug_list用法及代碼示例
- Rust Formatter.sign_minus用法及代碼示例
- Rust File用法及代碼示例
- Rust FileExt.read_exact_at用法及代碼示例
- Rust FileTypeExt.is_char_device用法及代碼示例
- Rust File.open用法及代碼示例
- Rust File.sync_data用法及代碼示例
- Rust Formatter.write_fmt用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Trait std::convert::From。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。