Rust 中 Rc::clone(&rc) 和 rc.clone() 的區別
Nilesh Katuwal
2023年1月30日
2022年5月18日
在本文中,我們將討論 Rust 中的 Rc::clone(&rc)
和 rc.clone()
之間的區別。這兩個特徵都用於克隆或複製物件。
在 Rust 中使用 Rc::clone(&rc)
進行克隆
Rc::clone(&rc)
用於建立一個新的共享引用,而不是克隆引用的底層物件。Rc
代表 Reference Counted
,型別 T
值的共享所有權由型別 Rc<T>
提供,在堆中分配。
use std::fmt;
use std::rc::Rc;
fn print_it<T: fmt::Display>(val: T) {
println!("{}", val);
}
fn main(){
let greet = Rc::new("Hello, world".to_string());
let borrowed = Rc::clone(&greet);
print_it(greet);
print_it(borrowed);
}
輸出:
Hello, world
Hello, world
我們已經通過使用 use
語句在上面編寫的程式碼中顯示了 Rc
的範圍。然後,使用原始字串建立與函式相關的 Rc
型別::new()
。
稍後使用另一個相對函式建立引用::clone()
用於原始 greet:RC
(這與初始引用不同,即&greet
)。我們嘗試使用此程式碼的函式 print_it
列印引用變數和原始變數。
Rc::clone
的執行不會像大多數型別的克隆執行那樣對資料進行深層複製。資料的深拷貝可能需要大量時間。
通過將 Rc::clone
用於引用計數,我們可以識別克隆的深拷貝型別以及增加引用計數的型別。在搜尋程式碼中的執行問題時,我們需要考慮深拷貝克隆並忽略對 Rc::clone
的呼叫。
Rust 中的 rc.clone()
clone()
函式建立一個新的擁有的控制代碼,它可以移動到一個新執行緒。根據 Rust 的標準庫,這個函式往往會使常見的程式碼模式容易被誤解。
問題在於,可以從詳細命名法中受益的更具體的過程和型別只能通過高階或抽象術語訪問。