Объявление трейта 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,
которые позволяют задать реализацию прямо в трейте