Menu
Coddy logo textTech

Что такое трейт?

Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 29 из 61.

Обобщения позволяют писать код, который работает с любым типом, но иногда вам нужно гарантировать, что тип может делать что-то конкретное. Именно здесь на помощь приходят типажи.

Трейт (trait) определяет набор методов, которые должен реализовать тип. Представьте это как контракт — любой тип, который «подписывает» этот контракт, обещает обеспечить указанное поведение. Если вы использовали интерфейсы в других языках, трейты служат аналогичной цели.

Вот как определяется типаж (trait):

trait Describable {
    fn describe(&self) -> String;
}

Ключевое слово trait объявляет типаж, за которым следует его имя. Внутри фигурных скобок вы объявляете сигнатуры методов — только имя, параметры и тип возвращаемого значения, без тела. Точка с запятой после сигнатуры указывает на то, что это требование, а не реализация.

Этот трейт Describable гласит: «Любой тип, который реализует меня, должен предоставить метод describe, который принимает ссылку на самого себя и возвращает String». Трейту не важно, как работает этот метод — это зависит от каждого типа, который его реализует.

Трейты становятся мощным инструментом, когда несколько различных типов реализуют один и тот же трейт. Book, Car и Person могут быть Describable, при этом каждый из них предоставляет свое собственное уникальное описание. Трейт гарантирует, что все они обладают этой общей возможностью.

challenge icon

Задание

Легко

Давайте определим ваш первый типаж (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!"
    
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Object Oriented Programming