Ограничение трейта
Ограничение трейта (trait bound) в Rust - это механизм, который позволяет наложить требование на обобщённый тип: тип должен реализовывать указанный трейт. Это даёт возможность вызывать методы этого трейта внутри обобщённой функции или структуры. Ограничение указывается после двоеточия в угловых скобках для параметра типа.
Синтаксис
fn имя_функции<T: ИмяТрейта>(параметр: T)
{
// тело функции
}
Пример
Давайте определим трейт Summary с методом summarize
и напишем функцию, которая принимает любой тип,
реализующий этот трейт:
trait Summary
{
fn summarize(&self) -> String;
}
struct Article
{
title: String,
content: String,
}
impl Summary for Article
{
fn summarize(&self) -> String
{
format!("{}: {}", self.title, self.content)
}
}
fn notify<T: Summary>(item: &T)
{
println!("{}", item.summarize());
}
fn main()
{
let article = Article {
title: String::from("Rust"),
content: String::from("abcde"),
};
notify(&article);
}
Результат выполнения кода:
"Rust: abcde"
Пример
Давайте используем синтаксис where для ограничения
трейта, что удобно при нескольких параметрах типа:
trait Summary
{
fn summarize(&self) -> String;
}
struct Article
{
title: String,
content: String,
}
impl Summary for Article
{
fn summarize(&self) -> String
{
format!("{}: {}", self.title, self.content)
}
}
fn notify<T>(item: &T)
where
T: Summary,
{
println!("{}", item.summarize());
}
fn main()
{
let article = Article {
title: String::from("12345"),
content: String::from("abcde"),
};
notify(&article);
}
Результат выполнения кода:
"12345: abcde"
Смотрите также
-
ключевое слово
where,
которое задаёт ограничения трейтов в отдельном блоке -
ключевое слово
impl Trait,
которое указывает трейт прямо в возвращаемом типе -
оператор
dyn Trait,
который создаёт тип-объект трейта для динамической диспетчеризации -
конструкция
impl Trait for Type,
которая реализует трейт для конкретного типа