Ich habe eine Eigenschaft, die eine Schnittstelle für Objekte definiert, die einen Wert enthalten können. Der Zug hat einen Weg, um den aktuellen Wert des Erhaltens:Wie abstrahiere ich über einen Verweis auf einen Wert oder einen Wert selbst?
pub trait HasValue<T> {
fn get_current_value(&self) -> &T;
}
Das ist in Ordnung, aber ich erkennen, dass in Abhängigkeit von der tatsächlichen Implementierung, manchmal ist es zweckmäßig, einen Verweis zurück, wenn T
in einem Feld gespeichert wird, und es ist manchmal bequem, um einen Klon von T
zurückzugeben, wenn das Hintergrundfeld über Threads geteilt wurde (zum Beispiel). Ich habe Mühe herauszufinden, wie ich dies in der Eigenschaft darstellen soll. Ich könnte so etwas wie dieses:
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,
}
}
}
Und get_current_value()
ändern, um eine BorrowedOrOwned<T>
zurückzukehren, aber ich bin nicht sicher, dass diese idiomatischen ist. BorrowedOrOwned<T>
Art erinnert mich an Cow<T>
, aber da der Punkt Cow
ist copy-on-write und ich werde alle Schreibvorgänge verwerfen, das scheint semantisch falsch.
Ist Cow<T>
der richtige Weg, um eine Referenz oder einen eigenen Wert zu abstrahieren? Gibt es einen besseren Weg als BorrowedOrOwned<T>
?
Würde einen zugeordneten Typ 'B: Borrow' Arbeit zurückgeben? –
@ChrisEmerson Ich bin nicht sicher, was die Kompromisse dabei tun würde, also bin ich mir nicht sicher. Könnten Sie das ein wenig erweitern? Dies scheint eine Frage zu sein, die allgemein nützlich sein kann, so dass ich an allen Antworten interessiert bin, auch wenn sie nicht auf meine spezifische Situation eingehen. –
Ich denke, eigentlich hilft es nicht direkt; Du brauchst immer noch etwas wie "Kuh". –