Rust(4) - Ownership
Ownership 是 Rust 中控管記憶體資源的機制。有 GC 的語言如 Java 和 Python 會時不時檢查物件被引用的數量,若沒人引用時則銷毀該物件。C 語言的話要自己釋放記憶體資源。
Rust ownership 代表該物件只有一份,擁有 ownership 的人才能使用該物件。Ownership 帶來的一個好處是記憶體控管相當容易因為物件不會被複製多份,另外運行時的效能跟記憶體使用都能有顯著的提升。
1. Ownership:
Ownership 會出現在長度大小不定的物件上,即非基本型別的物件。
fn main() {
let x: u32 = 10;
print_u32(x); // 這是一個 copy
println!("{}", x); // ok
let s: String = String::from("Hola mundo");
print_string(s); // print_string 借走 s 的所有權
println!("{}", s); // oops!
}
fn print_u32(x: u32) {
println!("{}", x);
}
fn print_string(s: String) {
println!("{}", s);
}
為減少不必要的物件拷貝呼叫 print_string 時 Rust 把記憶體的使用權交給 print_string。
需要注意的是所有權會在範疇結束時被銷毀。
fn main() {
let s1: String = String::from("Hola mundo");
{
let s2 = s1;
println!("s2: {}", s2);
}
println!("s1: {}", s1); // oops 所有權被 s2 拿走
}
透過表達式回傳拿回所有權。
fn main() {
let s1: String = String::from("Hola mundo");
let s1 = {
let s2 = s1;
println!("s2: {}", s2);
s2
};
println!("s1: {}", s1); // ok
}
2. 有借有還:
我們可以透過 "&" 聲明說這個所有權借用是有借有還的,舉個例子。
fn main() {
let s1: String = String::from("Hola mundo");
{
let s2 = &s1;
println!("s2: {}", s2);
} // 交還所有權
println!("s1: {}", s1); // ok
}
同理 function 也可以如法炮製:
fn main() {
let s: String = String::from("Hola mundo");
print_string(&s);
println!("{}", s);
}
// 宣吿 s 有借有還
fn print_string(s: &String) {
println!("{}", s);
}
3. 有借有還又可變:
有時候你會希望被借用的資料是可變的,這時可以使用 "&mut"。
fn main() {
let mut s: String = String::from("Hola ");
let name:String = String::from("Newton");
greet(&mut s, &name);
println!("s: {}", s);
}
fn greet(s: &mut String, name: &String) {
s.push_str(name) // 修改 s 的資料
}
留言
張貼留言