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