本系列錄製的影片主要放在B站上Rust死靈書學習影片
Rust 死靈書相關的原始碼資料在github.com/anonymousGiga/Rustonomi...
所有執行期分配的記憶體開始時都是 “未初始化”的。Rust 提供了處理未初始化記憶體的方式,既有安全的方式也有非安全的方式。
所有棧上的變數在顯式賦值之前都是未初始化的,但是Rust禁止程式設計師在賦值之前讀取這些變數。
//例子1
fn main() {
let i: i32;
//println!("i = {}", i); //error
if true {
i = 1;
println!("i = {}", i);
}
//println!("i = {}", i); //error
}
//例子2
fn main() {
let x: i32;
loop {
// Rust不知道這個分支會被無條件執行
//因為它依賴於實際值
if true {
// 但是它確實知道迴圈只會有一次,因為我們會無條件break
// 所以x不需要是可變的
x = 0;
break;
}
}
// 它也知道如果沒有執行break的話,程式碼不會執行到這裡
// 所以在這裡x一定已經被初始化了
println!("{}", x);
}
如果值從變數中移出且變數型別不是 Copy,那麼變數邏輯上處於未初始化狀態。
fn main() {
//如果值從變數中移出且變數型別不是 Copy,那麼變數邏輯上處於未初始化狀態
let x = 0;
let y = Box::new(0);
let z1 = x; // x仍然是合法的,因為i32是Copy
let z2 = y; // y現在邏輯上未初始化,因為Box不是Copy
println!("x = {}", x);
//println!("y = {}", y);
println!("z1 = {}", z1);
println!("z2 = {}", z2);
//y = Box::new(1); // 重新初始化y, error,需要將y修改成mut
println!("Hello, world!");
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結