FromInto

FromInto 特性本质上是相互关联的,这实际上是其实现的一部分。如果您可以从类型 B 转换为类型 A,那么我们应该能够将类型 B 转换为类型 A,这很容易理解。

From

From 特性允许一个类型定义如何从另一个类型创建自身,从而提供了一种非常简单的机制来在多个类型之间进行转换。标准库中包含许多此特性的实现,用于转换基本类型和常见类型。

例如,我们可以轻松地将 str 转换为 String

#![allow(unused)]
fn main() {
let my_str = "hello";
let my_string = String::from(my_str);
}

我们可以为我们自己的类型定义转换做类似的事情。

use std::convert::From;

#[derive(Debug)]
struct Number {
    value: i32,
}

impl From<i32> for Number {
    fn from(item: i32) -> Self {
        Number { value: item }
    }
}

fn main() {
    let num = Number::from(30);
    println!("My number is {:?}", num);
}

Into

Into 特性只是 From 特性的倒数。也就是说,如果您已经为您的类型实现了 From 特性,那么 Into 将在必要时调用它。

使用 Into 特性通常需要指定要转换成的类型,因为编译器在大多数情况下无法确定这一点。然而,考虑到我们免费获得了这个功能,这是一个很小的代价。

use std::convert::Into;

#[derive(Debug)]
struct Number {
    value: i32,
}

impl Into<Number> for i32 {
    fn into(self) -> Number {
        Number { value: self }
    }
}

fn main() {
    let int = 5;
    // Try removing the type annotation
    let num: Number = int.into();
    println!("My number is {:?}", num);
}