隐式类型转换

与 C++ 不同,Rust 不会自动进行 隐式类型转换。例如,下面的程序中不存在隐式类型转换:

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> 是否已被实现。