Ricerca…


introduzione

La maggior parte degli operatori di Rust può essere definita ("sovraccaricata") per i tipi definiti dall'utente. Questo può essere ottenuto implementando il rispettivo tratto nel modulo std::ops .

Sovraccarico dell'operatore di addizione (+)

Il sovraccarico dell'operatore di addizione (+) richiede l'implementazione di std::ops::Add trait.

Dalla documentazione, la definizione completa del tratto è:

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

Come funziona?

  • il tratto è implementato per il tipo di mano sinistra
  • il tratto è implementato per un argomento sul lato destro, a meno che specificato non abbia lo stesso tipo di quello del lato sinistro
  • il tipo del risultato dell'aggiunta è specificato nel tipo associato Output

Quindi, è possibile avere 3 tipi diversi.

Nota: il tratto consuma argomenti sul lato sinistro e sul lato destro, potresti preferire implementarlo per i riferimenti al tuo tipo piuttosto che per i tipi nudi.


Implementazione + per un tipo personalizzato:

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow