Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpOrAd 99 of 288 menu
◀ ▶

Сложение для своего типа в 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).

Скажите, зачем в реализации трейта сложения указывают отдельный тип результата, а не полагаются только на возвращаемый тип метода.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить