Rust
Betreiber und Überladung
Suche…
Einführung
Die meisten Operatoren in Rust können für benutzerdefinierte Typen definiert ("überladen") werden. Dies kann erreicht werden, indem das entsprechende Merkmal im Modul
std::ops
implementiert wird.
Überladen des Additionsoperators (+)
Um den Additionsoperator (+) zu überladen, muss die Eigenschaft std::ops::Add
implementiert werden.
Aus der Dokumentation ist die vollständige Definition des Merkmals:
pub trait Add<RHS = Self> {
type Output;
fn add(self, rhs: RHS) -> Self::Output;
}
Wie funktioniert es?
- Das Merkmal ist für den Typ "Left Hand Side" implementiert
- Das Merkmal ist für ein Argument der rechten Seite implementiert, sofern es nicht angegeben ist, es hat standardmäßig den gleichen Typ wie das linke Element
- Der Typ des Ergebnisses der Addition wird im zugehörigen Typ
Output
Somit sind 3 verschiedene Typen möglich.
Hinweis: Das Merkmal besteht aus Argumenten der linken und der rechten Seite. Sie können die Implementierung vorzugsweise für Verweise auf Ihren Typ anstelle der bloßen Typen implementieren.
+
Für einen benutzerdefinierten Typ implementieren:
use std::ops::Add;
#[derive(Clone)]
struct List<T> {
data: Vec<T>,
}
// Implementation which consumes both LHS and RHS
impl<T> Add for List<T> {
type Output = List<T>;
fn add(self, rhs: List<T>) -> List<T> {
self.data.extend(rhs.data.drain(..));
self
}
}
// Implementation which only consumes RHS (and thus where LHS != RHS)
impl<'a, T: Clone> Add<List<T>> for &'a List<T> {
type Output = List<T>;
fn add(self, rhs: List<T>) -> List<T> {
self.clone() + rhs
}
}
Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow