我有一個特徵定義了一個可以保存值的對象的接口。性狀具有獲取當前值的方式:如何通過引用抽象爲值或值本身?
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我不確定這樣做的折衷是什麼,所以我不確定。你可以擴展一下嗎?這似乎是一個普遍有用的問題,所以即使他們沒有解決我的具體情況,我也會對所有答案感興趣。 –
我覺得其實並沒有直接幫助。你最終還是需要像牛這樣的東西。 –