为什么 `str` 被封装在 `String` 中而不是 `Box<str>` 中?

4

这并不会给我带来任何困难——我完全能够使用String——但是,为什么str封装在自己的特殊类型中,而不是在更通用的Box类型内部?如果有原因,那么答案可能会帮助我更好地处理Box

为什么str封装在String内部,而不是在Box<str>内部?这只是方便打字常见结构,还是有更深层次的原因?


1
可能是什么是Rust的Stringstr之间的区别?的重复问题。 - Zarenor
1
为什么 vector 是一个向量而不是 Box<slice> - Stargateur
1
请注意,Box<str> 是一种完全有效且偶尔有用的类型。它不是“而不是”,而是“以及”。 - trent
2个回答

7

String更像是一个Vec<char>而不是Box<str>——它有一些方法可以在末尾添加更多的char或整个str。它有长度和容量,而不仅仅是长度。和BoxVec一样,它拥有它的内容,并将它们放在堆上。但与Box不同的是,它还扩展了str的功能,超出了其固有属性。


啊,那么也许我现在应该问一下,为什么不是 Vec<str> 呢?但是谢谢你,我之前没有意识到这个要求——尽管回想起来很明显。 - Lemma Prism
3
@LemmaPrism 在这里提到,他对 Vec<char> 有所异议,更倾向于使用 Vec<u8>,但是String实际上就是一个 Vec<u8>。该源码是公开的,并且在文档中也有链接,你可以随意查看。 - Shepmaster
@Shepmaster 这是一个很好的观点。我认为从概念上讲,Vec<char> 更接近于这个概念,但在实现上,Vec<u8> 是字面上的真相(并更准确地表示了内存占用)。 - Zarenor
我已经意识到我的错误,我说成了 Vec<str> 而不是 Vec<char>,真是太愚蠢了。但是,源代码实际上非常容易审查!感谢 @Zarenor 指出了我本应该提出的问题。 - Lemma Prism

5

str主要有&self方法,因为它不能更改其包含的任何字符,因为字符的更改可能意味着长度的更改,并且它不能重新分配自己。另一方面,String类似于&mut str,因为它提供了操作str的方法。

例如,您可以向其添加内容,或者替换部分内容

另一方面,Box<str>不提供这些功能,因为它本质上是一个拥有的str,因此它只提供我之前提到的&self方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接