Rust
Opérateurs et surcharge
Recherche…
Introduction
La plupart des opérateurs de Rust peuvent être définis ("surchargés") pour les types définis par l'utilisateur. Cela peut être réalisé en implémentant le trait respectif dans le module
std::ops
.
Surcharger l'opérateur d'addition (+)
La surcharge de l'opérateur d'addition (+) nécessite l'implémentation du trait std::ops::Add
.
À partir de la documentation, la définition complète du trait est la suivante:
pub trait Add<RHS = Self> {
type Output;
fn add(self, rhs: RHS) -> Self::Output;
}
Comment ça marche?
- le trait est implémenté pour le type côté gauche
- le trait est implémenté pour un argument du côté droit, sauf s'il est spécifié qu'il a le même type que le côté gauche
- le type du résultat de l'addition est spécifié dans le type associé de
Output
Ainsi, avoir 3 types différents est possible.
Remarque: le trait consomme des arguments de gauche et de droite, vous préférerez peut-être l'implémenter pour des références à votre type plutôt qu'aux types dénudés.
Implémenter +
pour un type personnalisé:
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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow