013 Rust死灵书之类型转换

介绍

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

Rust 死灵书相关的源码资料在github.com/anonymousGiga/Rustonomi...

类型转换

考虑例子:

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。
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
令狐一冲
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!