为什么 `str` 封装在 `String` 中而不是 `Box<str>` 中?
Why is `str` encapsulated inside `String` instead of inside a `Box<str>`?
这不会给我带来任何困难——我完全有能力使用 String
——但是有什么理由将 str
封装在它自己的特殊类型中而不是更通用的 Box
类型?如果 是 的原因,那么答案可能会帮助我模拟如何以不同的方式使用 Box
。
为什么 str
封装在 String
中而不是 Box<str>
中?这么普通的结构是单纯为了方便打字还是有更深层次的原因?
String
比 Box<str>
更像 Vec<char>
- 它有方法可以在末尾推送更多 char
,或者推送整个 [=14] =].它有长度和容量,而不仅仅是长度。像 Box
和 Vec
一样,它拥有它的内容,并将它们放在堆上;与 Box
不同,它还扩展了 str
的功能,超出了其固有属性。
str
主要有 &self
方法,因为它不能改变它包含的任何字符,因为字符的改变可能意味着长度的改变,而且它不能重新分配自己。另一方面,String
类似于 &mut str
,因为它提供了操作 str
的方法。
例如,您可以push to it, or replace a section。
另一方面,Box<str>
提供了 none 因为它本质上是一个拥有的 str
所以它只提供了我谈到的 &self
方法更早。
这不会给我带来任何困难——我完全有能力使用 String
——但是有什么理由将 str
封装在它自己的特殊类型中而不是更通用的 Box
类型?如果 是 的原因,那么答案可能会帮助我模拟如何以不同的方式使用 Box
。
为什么 str
封装在 String
中而不是 Box<str>
中?这么普通的结构是单纯为了方便打字还是有更深层次的原因?
String
比 Box<str>
更像 Vec<char>
- 它有方法可以在末尾推送更多 char
,或者推送整个 [=14] =].它有长度和容量,而不仅仅是长度。像 Box
和 Vec
一样,它拥有它的内容,并将它们放在堆上;与 Box
不同,它还扩展了 str
的功能,超出了其固有属性。
str
主要有 &self
方法,因为它不能改变它包含的任何字符,因为字符的改变可能意味着长度的改变,而且它不能重新分配自己。另一方面,String
类似于 &mut str
,因为它提供了操作 str
的方法。
例如,您可以push to it, or replace a section。
另一方面,Box<str>
提供了 none 因为它本质上是一个拥有的 str
所以它只提供了我谈到的 &self
方法更早。