Супертрейты
Супертрейты - это механизм в 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,
который позволяет использовать трейты как динамические типы