我有一个特性,定义了一个可以保存值的对象接口。该特性有一种获取当前值的方法:
pub trait HasValue<T> {
fn get_current_value(&self) -> &T;
}
这很好,但是我意识到,根据实际实现,有时候如果
T
被存储在一个字段中,返回一个引用会更方便;而有时候如果支持多线程共享(例如),那么返回T
的克隆将更为方便。我正在努力想出如何在特质中表示这一点。我可以这样做:pub enum BorrowedOrOwned<'a, T: 'a> {
Borrowed(&'a T),
Owned(T)
}
impl<'a, T: 'a> Deref for BorrowedOrOwned<'a, T> {
type Target = T;
fn deref(&self) -> &T {
use self::BorrowedOrOwned::*;
match self {
&Borrowed(b) => b,
&Owned(ref o) => o,
}
}
}
并将
get_current_value()
更改为返回BorrowedOrOwned<T>
,但我不确定这是否符合惯用法。 BorrowedOrOwned<T>
有点让我想起了Cow<T>
,但由于Cow
的目的是进行复制并写入,而我将放弃任何写入,因此似乎在语义上是错误的。
Cow<T>
是抽象引用或拥有值的正确方式吗?除BorrowedOrOwned<T>
之外还有更好的方法吗?
B: Borrow<T>
是否可行? - Chris Emerson