看板 Marginalman 關於我們 聯絡資訊
: 從入門到入門 繼續借用與所有權 1. 隱式解引用 隱式可以一次到位 一個引用示範: let r: &Box<i32> = &x; 顯式解引用是這樣 有兩層要打兩個* let r_abs1 = i32::abs(**r); 但隱式解引用可以直接用 let r_abs2 = r.abs(); 2. 一個變數不能同時有別名+可變性 有機會造成Double Free、Race Condition、數值失效 所以可變變數只能用所有者變數(或可變借用)來修改 3. Vec的新分配空間 let v: Vec<i32> = vec![1, 2, 3]; let n: &i32 = &v[2]; // 引用v[2] 此時如果 v.push(4); n會直接失效 因為Vec會把原本的Heap釋放 重新建立一個新的大小的Heap來儲存新資料 4. 變數的權限 一個變數有三種權限:Read(R)、Write(W)、Ownership(O) 當變數被借用的時候 原本持有的所有權(O)會暫時被借用者拿走 直到借用結束歸還 此時原持有者只擁有Read的權力 5. 可變借用 let x = 0; let mut x_ref = &x; 此時x_ref擁有R W O 可以修改 而x僅剩下R的權力 但要注意的是如果要使用解引用: *x_ref 此時 *x_ref 解出來的引用是 x 而非 x_ref 因此 *x_ref 只能 Read 不能修改 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.248.143.172 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1742552097.A.605.html ※ 編輯: yam276 (60.248.143.172 臺灣), 03/21/2025 18:21:46