Rust 中的“str”有什么用吗?

Is there any use for `str` in Rust?

提问人:doliphin 提问时间:3/25/2021 更新时间:4/21/2021 访问量:455

问:

有没有一种情况可以在不借用的情况下使用?这有意义吗?str

我理解 和 的区别,但既然有,也一定有?String&str&strstr

字符串 Rust 所有权

评论

0赞 Masklinn 3/25/2021
这回答了你的问题吗?如何在 Rust 中实际使用动态大小的类型?

答:

8赞 Peter Hall 3/25/2021 #1

你不能用 type 的做很多事情,但在很多情况下,你会想要引用 type 。strstr

  • 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>&strmap.get("key")Qstrk&str&Q

    注解意味着不需要在编译时已知大小,明确允许使用未大小的类型。?SizedQstr

4赞 Sören 3/25/2021 #2

因为是未大小的(?Sized),这意味着编译时的大小是未知的。您只能在允许的地方使用它。Box 就是这种情况。str?Sized

let s: &str = "any string";
let box: Box<str> = Box::from(s);

由于 box 在堆上分配数据,因此它并不关心在编译时是否不知道类型的大小。

您可以在 String::into_boxed_str 中看到 used,如果您想说,我已经完成了字符串的生成并且不想向其添加任何内容,这很有用。此外,它还删除了所需的容量字段,从而节省了一些内存。但是,我还没有真正看到它被广泛使用。Box<str>String

大多数你会看到没有以前的地方都是在具有泛型类型的特征中。例如,在实现 AsRef.str&

pub struct CustomString(String);

impl AsRef<str> for CustomString {
    fn as_ref(&self) -> &str {
        self.0.as_str()
    }
}

旁注:行为类似于未调整大小的切片 ()。str[T]?Sized