Абстракции Rust отличаются от привычных в ООП. В частности вместо классов (классов объектов) используются классы типов, которые называются «trait» (не следует путать с trait из Scala, где под этим термином прячутся
примеси — mixin).
Классы типов не уникальны для Rust, они поддержаны в Haskell, Mercury, Go, из можно реализовать
слегка извращенным способом на Scala и C++.
Я хочу показать, как они реализуются в Rust на примере
дуальных чисел и разобрать отдельные нетривиальные (или плохо проработанные) моменты.
Интерфейсы числовых типов довольно громоздки, и я буду вставлять здесь только фрагменты кода. Весь код доступен на
github (Update: работающая версия доступна на
crates.io).
Большинство реализованных здесь интерфейсов имеют статус experemental или unstable и скорее всего будут меняться. Я постараюсь поддерживать код и текст актуальными.
Rust поддерживает перегрузку операций, но, в отличие от C++, у операций есть метод-синоним с обычным буквенным именем. Так
a+b может быть записано
a.add(b), а для переопределения операции '+' надо просто реализовать метод add.