rust - 我是否必须为拥有(易于使用)和借用(更高效)的数据结构创建不同的结构?
问题描述
我有一个在一个主要是短暂的缓冲区Message<'a>
上的引用。这些引用要求特定的程序流程,因为它们保证永远不会超过缓冲区的生命周期。&'a str
'a
现在我还想要一个拥有的版本Message
,这样它就可以移动,通过线程发送等。
有没有一种惯用的方法来实现这一目标?我认为这Cow<'a, str>
可能会有所帮助,但不幸的是,Cow
它不会神奇地分配,以防&'a str
缓冲区的生命周期更长。
AFAIKCow
并不特殊,因为无论是否Cow
持有Owned
变体,它仍然必须通过借用检查器'a
。
的定义std::borrow::Cow
。
pub enum Cow<'a, B> {
Borrowed(&'a B),
Owned(<B as ToOwned>::Owned),
}
有没有一种惯用的方式来拥有一个拥有的变体Message
?出于某种原因,我们有&str
and String
, &[u8]
and Vec<u8>
, ...这是否意味着人们通常会选择&msg
and Message
?
我想我仍然需要考虑是否真的需要自有变体,但我的经验表明,为自有变体设置逃生舱通常会提高原型制作速度。
解决方案
是的,您需要有多种类型,一种代表拥有的概念,一种代表借用的概念。
您将在整个标准库和第三方 crate 中看到相同的技术。
也可以看看:
推荐阅读
- node.js - Google App Engine 502 错误:服务器错误 Node.js
- android - 在文件“/activity_login.xml”DataBinding 中发现重复的类,未生成 BR
- triggers - 我的触发器语法有什么问题?
- java - 余数为 0 的 Java 评分计算器
- python - Python正则表达式:将一个符号变为两个
- matlab - Octave/MATLAB 函数将罗马数字转换为十进制数
- javascript - 无法加载 js:带变量的函数
- typescript - 从 JS 对象派生类型
- google-cloud-bigtable - Google Bigtable 导出失败并出现 java.lang.NoSuchMethodError
- java - 将jar文件转换为exe文件