提问人:doliphin 提问时间:3/25/2021 更新时间:4/21/2021 访问量:455
Rust 中的“str”有什么用吗?
Is there any use for `str` in Rust?
答:
8赞
Peter Hall
3/25/2021
#1
你不能用 type 的值做很多事情,但在很多情况下,你会想要引用 type 。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
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
评论