Zoeken…


Invoering

De meeste operators in Rust kunnen worden gedefinieerd ("overbelast") voor door de gebruiker gedefinieerde typen. Dit kan worden bereikt door de respectieve eigenschap in std::ops module te implementeren.

Overbelasting van de opteloperator (+)

Overbelasting van de opteloperator (+) vereist implementeren van de std::ops::Add eigenschap std::ops::Add .

Uit de documentatie is de volledige definitie van de eigenschap:

pub trait Add<RHS = Self> {
    type Output;
    fn add(self, rhs: RHS) -> Self::Output;
}

Hoe werkt het?

  • de eigenschap is geïmplementeerd voor het type Linkerzijde
  • de eigenschap is geïmplementeerd voor één argument aan de rechterkant, tenzij gespecificeerd, heeft het standaard hetzelfde type als het argument aan de linkerkant
  • het type resultaat van de toevoeging is opgegeven in het bijbehorende type Output

Er zijn dus 3 verschillende typen mogelijk.

Opmerking: de eigenschap die wordt gebruikt is argumenten aan de linkerkant en aan de rechterkant, u kunt de voorkeur geven aan het implementeren van verwijzingen naar uw type in plaats van de blote typen.


+ Implementeren voor een aangepast type:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow