隐式转换

Rust 不会在类型间自动应用 隐式转型不像 C++)。你可以在类似这样的程序中看到这一点:

fn multiply(x: i16, y: i16) -> i16 {
    x * y
}

fn main() {
    let x: i8 = 15;
    let y: i16 = 1000;

    println!("{x} * {y} = {}", multiply(x, y));
}

Rust 的整数类型都实现了 From<T>Into<T> trait,让我们可以进行转换。From<T> trait 只有一个 from() 方法,类似地,Into<T> trait 也只有一个方法 into()。一个类型通过实现这些 trait 表达它如何转换为另外一种类型。

标准库有一个 From<i8> for i16 实现,这意味着我们可以通过调用 i16::from(x),将一个 i8 类型的变量 x 转换为一个 i16 类型变量。或者,更简单地,使用 x.into(),因为 From<i8> for i16 实现会自动创建一个 Into<i16> for i8 实现。

这同样适用于你自己类型的 From 实现,因此仅实现 From 即可自动获得相应的 Into 实现。

  1. 执行上面的程序并查看编译器错误。

  2. 更新上面的代码,使用 into() 来做转换。

  3. 更改 xy 为其它类型(比如 f32, bool, i128)来看看你可以将什么类型转为哪些其它类型。尝试将小类型转换为大类型,然后反过来试试。查看标准库文档来看看 From<T> 是否在你检查的类型对之间有实现。