我有一个特征定义了一个可以保存值的对象的接口。性状具有获取当前值的方式:如何通过引用抽象为值或值本身?
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:借用'工作吗? –
@ChrisEmerson我不确定这样做的折衷是什么,所以我不确定。你可以扩展一下吗?这似乎是一个普遍有用的问题,所以即使他们没有解决我的具体情况,我也会对所有答案感兴趣。 –
我觉得其实并没有直接帮助。你最终还是需要像牛这样的东西。 –