Ограничение типа трейтом в Rust
Имя типа ограничивают трейтом, и внутри
доступны его методы. В списке параметров
типа после имени ставят двоеточие и имя
набора. Тогда функция принимает ссылку
на любое значение, которое выполняет
этот набор, без записи impl в параметре.
Выведем приветствие через обобщенную функцию с ограничением:
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: Greet>(item: &T) {
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: Greet>(item: &T) -> String {
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 Score {
points: i32,
}
let score = Score { points: 40 };
Сделайте набор с методом, возвращающим
points, и функцию с ограничением
по этому набору. Выведите число.
Скажите, чем запись с именем типа и трейтом
отличается от параметра с impl
в сигнатуре.