【问题标题】:Do I have to create distinct structs for both owned (easy-to-use) and borrowed (more efficient) data structures?我是否必须为拥有(易于使用)和借用(更高效)的数据结构创建不同的结构?
【发布时间】:2020-07-11 01:54:50
【问题描述】:

我有一个Message<'a>,它在一个大部分短暂的缓冲区上有&'a str 引用。 这些引用要求特定的程序流程,因为它们保证永远不会超过缓冲区的生命周期'a

现在我还想拥有一个 Message 的自有版本,以便它可以移动、通过线程发送等。

有没有一种惯用的方法来实现这一点?我认为Cow<'a, str> 可能会有所帮助,但不幸的是,Cow 不会神奇地分配,以防&'a str 超过缓冲区的生命周期。

AFAIK,Cow 并不特殊,因为无论Cow 是否拥有Owned 变体,它仍必须通过'a 上的借用检查器。

std::borrow::Cow 的定义。

pub enum Cow<'a, B> {
    Borrowed(&'a B),
    Owned(<B as ToOwned>::Owned),
}

有没有一种惯用的方式来拥有Message 的自有变体?出于某种原因,我们有&amp;strString&amp;[u8]Vec&lt;u8&gt;,......这是否意味着人们通常会选择&amp;msgMessage

我想我仍然需要考虑是否真的需要自有变体,但我的经验表明,为自有变体设置逃生舱通常会提高原型制作速度。

【问题讨论】:

  • 您可以从一个寿命较短的Cow 创建一个寿命较长的let cow: Cow&lt;'static, _&gt; = Cow::Owned(cow.into_owned())
  • 是否可以将字符串类型本身作为Message 的参数,所以您可以在大多数情况下简单地使用Message&lt;&amp;str&gt;,而在不行的时候使用Message&lt;String&gt;?跨度>
  • @trentcl 我认为这是他们问题的合理解决方案,但最终仍然有两种不同的类型 ;-)

标签: rust borrowing owned-types


【解决方案1】:

是的,您需要有多种类型,一种代表拥有的概念,一种代表借用的概念。

您将在整个标准库和第三方 crate 中看到相同的技术。

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多