介绍

本系列录制的视频主要放在B站上​​Rust死灵书学习视频​

Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source

类型转换

考虑例子:

struct Foo {
a: i32,
b: i32,
}

struct Bar {
a: i32,
b: i32,
}

fn main() {
let f = Foo{a: 1, b: 2};
//let _b: Bar = f;

let _b: Bar = Bar{a: f.a, b: f.b};
//let _b: Bar = Bar{a: f.a, b: f.b};
let b = unsafe {&*(&f as *const Foo as * const Bar) };
println!("b = {:#?}", b);
}

说明:即使内部数据一样,也不能直接转换,如果要转换,则先转换成指针类型,然后在转换成目标指针类型,在解引用成目标类型。

强制类型转换

转换时,类型会被弱化,举一个例子:

&mut T 转换为 &T

特别注意的:在匹配 trait 的时候不会发生强制类型转换(receiver 除外,具体见下)。也就是说,如果为 U 实现了一个 trait,T 可以强制转换为 U,并不能认为 T 也实现了这个 trait。

trait Trait {}

fn foo<X: Trait>(t: X) {}

impl<'a> Trait for &'a i32 {}

fn main() {
let t: &mut i32 = &mut 0;
foo(t);//此处报错,&mut i32转换成 i32,并不表示&mut i32页实现了Trait这个trait。
}