【发布时间】: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 的自有变体?出于某种原因,我们有&str 和String、&[u8] 和Vec<u8>,......这是否意味着人们通常会选择&msg 和Message?
我想我仍然需要考虑是否真的需要自有变体,但我的经验表明,为自有变体设置逃生舱通常会提高原型制作速度。
【问题讨论】:
-
您可以从一个寿命较短的
Cow创建一个寿命较长的let cow: Cow<'static, _> = Cow::Owned(cow.into_owned())。 -
是否可以将字符串类型本身作为
Message的参数,所以您可以在大多数情况下简单地使用Message<&str>,而在不行的时候使用Message<String>?跨度> -
@trentcl 我认为这是他们问题的合理解决方案,但最终仍然有两种不同的类型 ;-)
标签: rust borrowing owned-types