在 Rust 中,如果我想&str在多個背景關系中只讀訪問一個而不復制實際的底層資料,我認為我只使用一個切片是否正確?
例子
let original_string = "here's a string";
let slice = &original_string[0..3];
或者需要類似的東西Rc<str>?
uj5u.com熱心網友回復:
任何參考型別&Tor &mut T(包括切片型別,如&stror &[T])只會借用資料,并且在使用時不會隱式復制或移動資料。
您可以Copy通過使用 取消參考來顯式地從參考復制到實作型別*,或者從參考復制到Clone通過呼叫clone方法實作的型別。您還可以通過將可變參考替換為不同的值(例如使用std::mem::take或 )來顯式移出可變參考std::mem::replace。
該真實由至少一個共享參照借來的任何資料&T必須僅針對參考的壽命被讀取,除了與內部可變性在容器內的資料,例如Cell<T>,RefCell<T>,Mutex<T>和AtomicU32。
通常,使用參考的最大限制是它們的生命周期必須短于資料所有者的生命周期。在某些情況下,這可能會使代碼難以或不可能完全用參考和生命周期來表達。參考計數指標像Rc<T>和Arc<T>可以提供幫助,因為它們通常類似于共享參考&T,除了不是從其他位置借用資料,而是將資料移動到Rc/Arc然后資料所有權在該Rc/ 的所有克隆之間共享Arc,消除了對參考生命周期的需要,但運行時成本很小。
uj5u.com熱心網友回復:
只讀訪問一個 &str
你是對的,代碼沒有復制字串,&str基本上包括 2 部分,一個指標和一個 len,因此
let original_string = "here's a string";
let slice = &original_string[0..3];
println!("{:?}", original_string.as_ptr());
println!("{:?}", original_string.len());
println!("{:?}", slice.as_ptr());
println!("{:?}", slice.len());
輸出看起來像
0x1074d4ee3
15
0x1074d4ee3
3
uj5u.com熱心網友回復:
切片字串不是復制,而是借用。這也意味著您必須保持原始字串至少與切片一樣長。(Frxstrem 的回答更好地解釋了這種方式。)
Rc<str>不會幫助你,因為它必須Rc在同一個字串或切片上,即你不能創建一個子切片,但可以用它計算相同基本字串上的參考。如果你確實需要這樣的東西,你必須Rc在原始字串上存盤一個,并用它存盤當前的切片范圍,例如像這樣:
#[derive(Clone)]
struct SharedString {
string: Rc<str>,
slice: Range<usize>,
}
impl Deref for SharedString {
type Target = str;
fn deref(&self) -> &str {
self.string.get(self.slice.clone()).unwrap()
}
}
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/393385.html
上一篇:用一些限制替換字符
下一篇:消除R中2個向量的部分重疊部分
