Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по 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, каждый предоставляя собственное уникальное описание. Трейт гарантирует, что все они обладают этой общей возможностью.

challenge icon

Задание

Легко

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

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

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Rust