Что такое трейт?
Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 29 из 61.
Обобщения позволяют писать код, который работает с любым типом, но иногда нужно гарантировать, что тип может что-то конкретное сделать. Именно здесь на помощь приходят traits.
trait определяет набор методов, которые тип должен реализовать. Считай это контрактом: любой тип, который «подписывает» этот контракт, обещает предоставить указанное поведение. Если ты использовал интерфейсы в других языках, trait выполняет аналогичную функцию.
Вот как определить trait:
trait Describable {
fn describe(&self) -> String;
}
Ключевое слово trait вводит trait, за которым следует его имя. Внутри фигурных скобок вы declare method signatures — только имя, параметры и тип возвращаемого значения, без body. Точка с запятой после signature указывает, что это требование, а не реализация.
Этот trait Describable гласит: «Любой тип, который реализует меня, должен предоставить метод describe, принимающий ссылку на себя и возвращающий String». Trait не важно, как работает этот метод: это зависит от каждого типа, который его реализует.
Трейты становятся мощными, когда несколько разных типов реализуют один и тот же трейt. Book, Car и Person могут быть Describable, каждый предоставляя собственное уникальное описание. Трейт гарантирует, что все они обладают этой общей возможностью.
Задание
ЛегкоДавайте определим ваш первый trait! trait устанавливает контракт: обещание, что любой тип, реализующий его, предоставит определённое поведение. Вы создадите trait Summarizable, который разные типы смогут реализовать, чтобы предоставлять summary самих себя.
Вы организуете свой код в двух файлах:
summary.rs: Define public trait под названиемSummarizableс single method signature:summarize(&self) -> String. Remember, в definition trait вы только declare method signature с помощью semicolon: без тела. Это сообщает Rust: «любой тип, реализующий этот trait, должен предоставлять методsummarize, который возвращаетString».main.rs: Подключите свой модуль summary и выведите message, подтверждающее, что ваш trait определён. Поскольку мы ещё не изучили, как реализовывать trait (это будет в следующем уроке!), вы просто проверите, что ваш trait корректно компилируется.
В своём основном файле выведите следующее message, чтобы подтвердить, что ваша definition trait корректна:
Summarizable trait defined successfully!Это задание посвящено исключительно синтаксису definition trait: ключевому слову trait, имени trait и объявлению method signature без реализаций. В следующем уроке вы узнаете, как заставить структуры реализовать этот trait!
Попробуйте сами
mod summary;
fn main() {
// TODO: Выведите подтверждающее сообщение о том, что трейт определён
// Expected output: "Summarizable trait defined successfully!"
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media PlayerПотренируйтесь самостоятельно: Онлайн-компилятор Rust