013 Rust死灵书之类型转换
原创
©著作权归作者所有:来自51CTO博客作者wx6364ffafc5a30的原创作品,请联系作者获取转载授权,否则将追究法律责任
介绍
本系列录制的视频主要放在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);
}
说明:即使内部数据一样,也不能直接转换,如果要转换,则先转换成指针类型,然后在转换成目标指针类型,在解引用成目标类型。
强制类型转换
转换时,类型会被弱化,举一个例子:
特别注意的:在匹配 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。
}