Методы по умолчанию
Методы по умолчанию - это методы, которые имеют реализацию прямо в определении трейта. Типы, реализующие этот трейт, могут использовать реализацию по умолчанию или переопределять её собственной. Параметром метод может принимать любые значения, определённые в сигнатуре метода, а также обращаться к другим методам трейта, в том числе к тем, которые не имеют реализации по умолчанию.
Синтаксис
trait TraitName
{
fn method_name(&self) -> ReturnType
{
// default implementation
}
}
Пример
Давайте создадим трейт Greet с методом
greet, имеющим реализацию по умолчанию,
и реализуем его для структуры Person:
trait Greet
{
fn greet(&self) -> String
{
String::from("Hello!")
}
}
struct Person
{
name: String,
}
impl Greet for Person {}
fn main()
{
let p = Person { name: String::from("Alice") };
println!("{}", p.greet());
}
Результат выполнения кода:
"Hello!"
Пример
Давайте переопределим метод greet
для структуры Person, чтобы он
использовал поле name:
trait Greet
{
fn greet(&self) -> String
{
String::from("Hello!")
}
}
struct Person
{
name: String,
}
impl Greet for Person
{
fn greet(&self) -> String
{
format!("Hello, {}!", self.name)
}
}
fn main()
{
let p = Person { name: String::from("Alice") };
println!("{}", p.greet());
}
Результат выполнения кода:
"Hello, Alice!"
Пример
Метод по умолчанию может вызывать другие методы
трейта, даже если они не имеют реализации
по умолчанию. Давайте создадим трейт Summary
с обязательным методом title и методом
summarize с реализацией по умолчанию:
trait Summary
{
fn title(&self) -> String;
fn summarize(&self) -> String
{
format!("Title: {}", self.title())
}
}
struct Article
{
title: String,
}
impl Summary for Article
{
fn title(&self) -> String
{
self.title.clone()
}
}
fn main()
{
let a = Article { title: String::from("Rust Traits") };
println!("{}", a.summarize());
}
Результат выполнения кода:
"Title: Rust Traits"
Смотрите также
-
ключевое слово
trait,
которое определяет общее поведение для типов -
конструкция
impl for,
которая реализует трейт для конкретного типа -
конструкция
impl Trait,
которая возвращает анонимный тип, реализующий трейт -
ограничение
trait bound,
которое задаёт требования к обобщённым типам