簡體   English   中英

Rust中的`str`有什么用嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM