FromInto

FromInto 两个 trait 是内在地联系着的,事实上这是它们的实现的重要 部分:如果能把类型 A 转换成类型 B,那么很容易相信我们也能把类型 B 转换成类型 A。

From

From trait 允许一种类型定义 “怎么根据另一种类型生成自己”,因此它提供了一种 类型转换的简单机制。在标准库中有无数 From 的实现,规定了原生类型及其他常见类 型的转换功能。

比如,可以很容易地把 str 转换成 String

  1. let my_str = "hello";
  2. let my_string = String::from(my_str);

也可以为我们自己的类型定义转换机制:

  1. use std::convert::From;
  2. #[derive(Debug)]
  3. struct Number {
  4. value: i32,
  5. }
  6. impl From<i32> for Number {
  7. fn from(item: i32) -> Self {
  8. Number { value: item }
  9. }
  10. }
  11. fn main() {
  12. let num = Number::from(30);
  13. println!("My number is {:?}", num);
  14. }

Into

Into trait 就是把 From trait 倒过来而已。也就是说,如果你为你的类型实现了 From,那么同时你也就免费获得了 Into

使用 Into trait 通常要求指明要转换到的类型,因为编译器大多数时候不能推断它。不 过考虑到我们免费获得了 Into,这点代价不值一提。

  1. use std::convert::From;
  2. #[derive(Debug)]
  3. struct Number {
  4. value: i32,
  5. }
  6. impl From<i32> for Number {
  7. fn from(item: i32) -> Self {
  8. Number { value: item }
  9. }
  10. }
  11. fn main() {
  12. let int = 5;
  13. // 试试删除类型说明
  14. let num: Number = int.into();
  15. println!("My number is {:?}", num);
  16. }