【问题标题】:Why is `str` encapsulated inside `String` instead of inside a `Box<str>`?为什么`str`封装在`String`中而不是`Box<str>`中?
【发布时间】:2019-08-08 21:37:03
【问题描述】:

这并没有给我带来任何困难——我完全可以使用String——但是有什么理由将str封装在它自己的特殊类型中而不是更通用的Box类型中?如果有原因,那么答案可能会帮助我模拟如何以不同方式使用Box

为什么str 封装在String 中而不是Box&lt;str&gt; 中?是为了方便输入这样一个通用的结构还是有更深层次的原因?

【问题讨论】:

标签: string rust smart-pointers


【解决方案1】:

String 更像是Vec&lt;char&gt; 而不是Box&lt;str&gt; - 它有方法可以在最后推送更多chars,或者推送整个str。它有长度和容量,而不仅仅是长度。像BoxVec 一样,它拥有它的内容,并将它们放在堆上;与Box 不同,它还扩展了str 的功能,超出了其固有属性。

【讨论】:

  • 啊,所以我现在应该问,为什么不是Vec&lt;str&gt;?但是谢谢你,我没有意识到这个要求——尽管回想起来很明显。
  • @LemmaPrism 我对Vec&lt;char&gt; 有点狡辩,出于某种原因更喜欢说Vec&lt;u8&gt;,但String is literally a Vec&lt;u8&gt;。源是开放的,也从文档链接;随意浏览它。
  • @Shepmaster 这是一个公平的观点。我想我的意思是从概念上讲,Vec&lt;char&gt; 更接近于概念,但在实现方面,Vec&lt;u8&gt; 确实是正确的(并且更准确地代表了内存占用)
  • 我才意识到我说的是Vec&lt;str&gt;而不是Vec&lt;char&gt;;傻我。但是,是的,来源非常容易审查!感谢@Zarenor 指出我应该提出的问题。
【解决方案2】:

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

例如,你可以push给它,或者replace a section

另一方面,Box&lt;str&gt; 不提供这些,因为它本质上是一个拥有的str,因此它只提供我之前谈到的&amp;self 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 2017-02-18
    • 2021-10-08
    • 2021-07-04
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多