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