作者:
yam276 ('_')
2025-03-24 14:09:28: https://space.bilibili.com/361469957/lists/3902595
: 從入門到入門
1. 借用與生命週期
fn return_a_string -> &String {
let s = String::new();
&s
}
這段code編譯錯誤,
因為&s這個return value作為借用者的生命週期大於s
你不能借用並使用已經不存在的東西
因此你可以:
fn return_a_string -> String {
let s = String::new();
s
}
不是借用,而是轉移所有權,
這代表s指向的heap在離開之後仍然存在不會被回收
或是:
fn return_a_string() -> &'static str {
"Hello, world!"
}
靜態變數代表存活於整個程式週期
還有一種C語言風格的解法:
fn return_a_string(s: &mut String)
{
s.replace_range(.., "Hello, World"); // ..代表修改全部
}
但很姆咪,除非你是C語言老害,不然別用
2. Rc與Arc
fn return_a_string -> Rc<String> {
let s = Rc::new(String::from("Hello, World");
Rc::clone(&s)
}
Rc與Arc類似C++的shared_ptr,
會有一個計數器來判斷有幾個引用,
引用數為-1才回收資料,
跟C++一樣同樣也有weak參考避免循環引用
let weak_ref = Rc::downgrade(&node);
3. clone與join
解決借用與所有權最快的方法是.clone()
但問題是.clone()有多餘記憶體開銷,
.join則是能用於容器與字串,
他可能會比.clone()有較少開銷,
因為.clone()是完整複製,
而.join()是消耗把特定成員連起來的記憶體開銷,
速度來說.clone()是O(n)而.join()則是O(n)+新長度計算
另外Rc這種東西的.clone()僅僅是增加借用counter,不會複製內容