[英]Is there any use for `str` in Rust?
有沒有人會在不借用str
的情況下使用它? 這甚至有意義嗎?
我了解String
和&str
之間的區別,但是既然有&str
,那么還必須有str
嗎?
你不能對str
類型的值做很多事情,但是在很多情況下你會想要引用str
類型。
Box<str>
或Rc<str>
- 擁有的類型,類似於String
,但不能被變異以增長或重新分配
任何時候您想要接受可以被視為字符串的任意類型,您都可以使用T: Deref<Target = str>
、 T: AsRef<str>
或T: Borrow<str>
之類的約束。 例如HashMap::get
具有以下簽名:
pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V> where K: Borrow<Q>, // K is the key type for the HashMap Q: Hash + Eq,
這意味着您可以擁有HashMap<String, i32>
,但可以使用&str
鍵訪問值,例如map.get("key")
。 這里Q
將被推斷為str
,但k
參數仍然是&str
( &Q
)。
?Sized
注釋意味着Q
不需要在編譯時具有已知的大小,明確允許使用像str
這樣的未調整大小的類型。
因為str
是 unsized (? Sized ) 意味着編譯時的大小是未知的。 您只能在允許?Sized
的地方使用它。 Box就是這種情況。
let s: &str = "any string";
let box: Box<str> = Box::from(s);
因為 box 在堆上分配數據,所以它不關心類型的大小在編譯時是否未知。
您可以看到在String::into_boxed_str中使用的Box<str>
,如果您想說,我已完成生成字符串並且不想向其中添加任何內容,這很有用。 此外,它刪除了String
需要的容量字段,從而節省了一點 memory。 但是,我還沒有真正看到它被大量使用。
大多數你會看到沒有&
之前的str
的地方是具有泛型類型的特征。 例如在實現AsRef時。
pub struct CustomString(String);
impl AsRef<str> for CustomString {
fn as_ref(&self) -> &str {
self.0.as_str()
}
}
旁注: str
的行為類似於未調整大小 ( ?Sized
) 的切片[T]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.