РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
542 of 1245 menu

Объявление трейта trait

Ключевое слово trait объявляет трейт - именованный набор методов и связанных типов, которые определяют поведение, общее для разных типов. Трейт задаёт сигнатуры методов без реализации (или с реализацией по умолчанию), а конкретные типы затем реализуют этот трейт через impl. Параметром объявления выступает имя трейта, а в его теле перечисляются методы, связанные типы и константы.

Синтаксис

trait TraitName { fn method(&self) -> ReturnType; }

Пример

Давайте объявим трейт Greet с одним методом greet и реализуем его для структуры Person:

trait Greet { fn greet(&self) -> String; } struct Person { name: String, } impl Greet for Person { fn greet(&self) -> String { format!("Hello, {}!", self.name) } } fn main() { let p = Person { name: String::from("abcde") }; println!("{}", p.greet()); }

Результат выполнения кода:

"Hello, abcde!"

Пример

Давайте объявим трейт с методом по умолчанию и переопределим его в одной из реализаций:

trait Greet { fn greet(&self) -> String { String::from("Hello!") } } struct Person; struct Robot; impl Greet for Person {} impl Greet for Robot { fn greet(&self) -> String { String::from("Beep boop") } } fn main() { let p = Person; let r = Robot; println!("{}", p.greet()); println!("{}", r.greet()); }

Результат выполнения кода:

"Hello!" "Beep boop"

Пример

Давайте объявим трейт со связанным типом и реализуем его для двух разных типов:

trait Container { type Item; fn first(&self) -> Option<&Self::Item>; } struct Numbers { items: Vec<i32>, } impl Container for Numbers { type Item = i32; fn first(&self) -> Option<&Self::Item> { self.items.first() } } fn main() { let n = Numbers { items: vec![1, 2, 3, 4, 5] }; println!("{:?}", n.first()); }

Результат выполнения кода:

Some(1)

Смотрите также

  • ключевое слово impl-for,
    которое реализует трейт для конкретного типа
  • конструкция dyn-trait,
    которая создаёт трейт-объект для динамической диспетчеризации
  • ограничение trait-bound,
    которое задаёт требования к обобщённым типам
  • методы по умолчанию default-methods,
    которые позволяют задать реализацию прямо в трейте
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить