看板 Marginalman 關於我們 聯絡資訊
: 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,不會複製內容 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.248.143.163 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1742796570.A.62A.html ※ 編輯: yam276 (60.248.143.163 臺灣), 03/24/2025 14:09:55
oin1104: 我哭了 大師 只剩我連c++都寫不好了 03/24 14:10