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

Супертрейты

Супертрейты - это механизм в Rust, который позволяет указать, что для реализации одного трейта тип обязан также реализовывать другой трейт. Синтаксис использует двоеточие после имени трейта, за которым следует список требуемых трейтов. Если тип реализует трейт с супертрейтом, компилятор проверит, что этот тип также реализует все указанные супертрейты.

Синтаксис

trait TraitName: SuperTrait1 + SuperTrait2 { // methods }

Пример

Давайте создадим трейт Describe, который требует реализации трейта Display. Затем реализуем оба трейта для структуры Point:

use std::fmt; trait Describe: fmt::Display { fn describe(&self) -> String { format!("This is: {}", self) } } struct Point { x: i32, y: i32, } impl fmt::Display for Point { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "({}, {})", self.x, self.y) } } impl Describe for Point {} fn main() { let p = Point { x: 1, y: 2 }; println!("{}", p.describe()); }

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

"This is: (1, 2)"

Пример

Давайте создадим трейт Printable с двумя супертрейтами: Display и Clone. Реализуем их для структуры Message:

use std::fmt; trait Printable: fmt::Display + Clone { fn print_twice(&self) { println!("{}", self); println!("{}", self.clone()); } } #[derive(Clone)] struct Message { text: String, } impl fmt::Display for Message { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.text) } } impl Printable for Message {} fn main() { let m = Message { text: String::from("abcde") }; m.print_twice(); }

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

"abcde" "abcde"

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

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