Rust
Operatörer och överbelastning
Sök…
Introduktion
De flesta operatörer i Rust kan definieras ("överbelastad") för användardefinierade typer. Detta kan uppnås genom att implementera respektive drag i
std::ops
modulen.
Överbelastning av tilläggsoperatören (+)
Överbelastning av tilläggsoperatören (+) kräver implementering av std::ops::Add
egenskap.
Från dokumentationen är den fulla definitionen av egenskaperna:
pub trait Add<RHS = Self> {
type Output;
fn add(self, rhs: RHS) -> Self::Output;
}
Hur fungerar det?
- Egenskapen är implementerad för vänster sida
- Egenskapen implementeras för ett argument på höger sida, såvida det inte anges att det är standard att ha samma typ som vänsterhand ett
- typen av resultatet av tillägget anges i den tillhörande typen
Output
Således är det möjligt att ha 3 olika typer.
Obs! Egenskapen konsumerar är vänster- och högersidesargument, du kanske föredrar att implementera det för referenser till din typ snarare än bara typer.
Implementera +
för en anpassad typ:
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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow