定义:

  1. pub trait From<T> {
  2. fn from(T) -> Self;
  3. }

用来将其他类型准换为自己的类型

例1:显式调用from函数

  1. let string = "hello".to_string();
  2. let other_string = String::from("hello");
  3. assert_eq!(string, other_string);

例2:通过?运算符来调用

当为CliError实现From<io::Error>::from后,会自动为io::Error生成一个Into<CliError>::into
?会在返回值上调用into方法将此io::Error转换为CliError类型
这在当函数返回单个错误类型来代表所有可能失败的方式时很有用,即使其可能会因很多种原因失败。

  1. use std::fs;
  2. use std::io;
  3. use std::num;
  4. enum CliError {
  5. IoError(io::Error),
  6. ParseError(num::ParseIntError),
  7. }
  8. // 为io::Error实现转换
  9. impl From<io::Error> for CliError {
  10. fn from(error: io::Error) -> Self {
  11. CliError::IoError(error)
  12. }
  13. }
  14. // 为num::ParseIntErro实现转换
  15. impl From<num::ParseIntError> for CliError {
  16. fn from(error: num::ParseIntError) -> Self {
  17. CliError::ParseError(error)
  18. }
  19. }
  20. fn open_and_parse_file(file_name: &str) -> Result<i32, CliError> {
  21. let mut contents = fs::read_to_string(&file_name)?; // 自动调用From函数
  22. let num: i32 = contents.trim().parse()?;
  23. Ok(num)
  24. }