Сложение для своего типа в Rust
Знак плюс для своего типа опирается на стандартный трейт сложения. Он задает тип результата и метод, который вызывает знак плюс. Для двух значений одного пользовательского типа результат тоже должен быть этим типом, если смысл операции такой же, как у обычных чисел.
Объявим оболочку вокруг i32 и опишем
сложение полей внутри метода трейта:
struct Meter(i32);
impl std::ops::Add for Meter {
type Output = Meter;
fn add(self, other: Meter) -> Meter {
Meter(self.0 + other.0)
}
}
fn main() {
let sum = Meter(2) + Meter(3);
println!("{}", sum.0);
}
Оболочка Meter собирает значение
из целого в записи Meter(2).
Знак плюс между двумя такими значениями
вызывает метод трейта, а переменная
sum хранит новую оболочку с суммой
полей.
Тот же прием подходит, когда нужно сложить два счетчика одного вида и снова получить счетчик, а не голое число:
struct Step(i32);
impl std::ops::Add for Step {
type Output = Step;
fn add(self, other: Step) -> Step {
Step(self.0 + other.0)
}
}
fn main() {
let total = Step(10) + Step(4);
println!("{}", total.0);
}
Дана структура:
struct Hour(i32);
Опишите сложение двух Hour так,
чтобы результат снова был Hour,
сложите Hour(5) и Hour(2)
и выведите поле .0.
Дана структура:
struct Pack(i32);
Сделайте так, чтобы две оболочки Pack
можно было сложить в одну, выведите поле
итога для Pack(1) и Pack(8).
Скажите, зачем в реализации трейта сложения указывают отдельный тип результата, а не полагаются только на возвращаемый тип метода.