当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。