本文简要介绍rust语言中 Trait core::convert::From
的用法。
用法
pub trait From<T>: Sized {
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。
注意:这个特质一定不能失败.如果转换可能失败,请使用core::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 From用法及代码示例
- 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-lang.org大神的英文原创作品 Trait core::convert::From。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。