Ограничение отдельной записью в Rust
Длинное ограничение пишут после списка параметров отдельным словом. Сначала объявляют имена типов без требований в круглых скобках, а затем перечисляют, какой трейт должен выполнить каждый тип. Смысл совпадает с записью через двоеточие в угловых скобках.
Перепишем функцию приветствия с отдельным блоком ограничений:
trait Greet {
fn greet(&self) -> String;
}
struct User {
name: &'static str,
}
impl Greet for User {
fn greet(&self) -> String {
format!("hello, {}", self.name)
}
}
struct Bot {
id: i32,
}
impl Greet for Bot {
fn greet(&self) -> String {
format!("bot {}", self.id)
}
}
fn show<T>(item: &T)
where
T: Greet,
{
let line = item.greet();
println!("{}", line);
}
fn main() {
let user = User { name: "ann" };
let bot = Bot { id: 2 };
show(&user);
show(&bot);
}
Тот же прием удобен, когда функция возвращает строку:
trait Greet {
fn greet(&self) -> String;
}
struct User {
name: &'static str,
}
impl Greet for User {
fn greet(&self) -> String {
format!("hello, {}", self.name)
}
}
fn line_for<T>(item: &T) -> String
where
T: Greet,
{
item.greet()
}
fn main() {
let user = User { name: "leo" };
let text = line_for(&user);
println!("{}", text);
}
Дана структура:
struct Cat {
name: &'static str,
}
let cat = Cat { name: "neo" };
Выполните набор приветствия для Cat
и запишите функцию с отдельным блоком
ограничений, которая печатает greet.
Передайте cat по ссылке.
Дана структура:
struct Tag {
label: &'static str,
}
let tag = Tag { label: "go" };
Сделайте набор с методом, который возвращает
label, и функцию с вынесенным
ограничением, отдающую строку подписи.
Выведите ее.
Скажите, когда удобнее держать ограничение рядом с именем типа, а когда выносить его отдельным блоком.