定义:
pub trait From<T> {
fn from(T) -> Self;
}
用来将其他类型准换为自己的类型
例1:显式调用from
函数
let string = "hello".to_string();
let other_string = String::from("hello");
assert_eq!(string, other_string);
例2:通过?
运算符来调用
当为CliError
实现From<io::Error>::from
后,会自动为io::Error
生成一个Into<CliError>::into
?
会在返回值上调用into
方法将此io::Error
转换为CliError
类型
这在当函数返回单个错误类型来代表所有可能失败的方式时很有用,即使其可能会因很多种原因失败。
use std::fs;
use std::io;
use std::num;
enum CliError {
IoError(io::Error),
ParseError(num::ParseIntError),
}
// 为io::Error实现转换
impl From<io::Error> for CliError {
fn from(error: io::Error) -> Self {
CliError::IoError(error)
}
}
// 为num::ParseIntErro实现转换
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)?; // 自动调用From函数
let num: i32 = contents.trim().parse()?;
Ok(num)
}