Rust
Операторы и перегрузка
Поиск…
Вступление
Большинство операторов в Rust могут быть определены («перегружены») для пользовательских типов. Это может быть достигнуто путем реализации соответствующего признака в модуле
std::ops
.
Перегрузка оператора сложения (+)
Для перегрузки оператора сложения (+) требуется реализовать std::ops::Add
trait.
Из документации полное определение признака:
pub trait Add<RHS = Self> {
type Output;
fn add(self, rhs: RHS) -> Self::Output;
}
Как это работает?
- черта реализована для типа «Левая рука»
- признак реализуется для одного аргумента правой руки, если не указано, что он по умолчанию имеет тот же тип, что и левая сторона стороны
- тип результата добавления указан в соответствующем типе
Output
Таким образом, возможны 3 разных типа.
Примечание: потребляемый признак - это аргументы с левой стороны и правой стороны, вы можете предпочесть реализовать его для ссылок на ваш тип, а не на голые типы.
Внедрение +
для настраиваемого типа:
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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow