013 Rust死靈書之型別轉換

linghuyichong發表於2021-03-07

本系列錄製的影片主要放在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 協議》,轉載必須註明作者和本文連結
令狐一衝

相關文章