私は、値を保持できるオブジェクトのインタフェースを定義する特性を持っています。特色は、現在の値を取得する方法があります。値または値自体への参照を抽象化する方法はありますか?
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,
}
}
}
をそしてBorrowedOrOwned<T>
を返すようにget_current_value()
を変更するが、私は、これは慣用的であることはよく分かりません。 BorrowedOrOwned<T>
の種類は私にCow<T>
を覚えていますが、Cow
の点はになりますので、コピー時にはにコピーされ、意味的には間違っていると思います。
Cow<T>
は、参照または所有された値を抽象する正しい方法ですか? BorrowedOrOwned<T>
よりも良い方法はありますか?
関連するタイプ「B:Borrow」が返されますか? –
@ChrisEmerson私はそれを行うことのトレードオフがどういうわけか分かりませんので、私は確信していません。少し拡大していただけますか?これは一般的に有用な質問のように思えるので、私の特定の状況に対処しなくてもすべての回答に興味があります。 –
私は実際に直接役立たないと思う。あなたはまだ「牛」のようなものが必要になります。 –