Выполнение трейта для типа в Rust
Тип выполняет трейт отдельным блоком, без пометки в самом типе. Структура или перечисление объявляются как раньше, а ниже или рядом пишут блок, где имя трейта связывают с этим типом и дают тела методов.
Подключим приветствие для пользователя:
trait Greet {
fn greet(&self) -> String;
}
struct User {
name: &'static str,
}
impl Greet for User {
fn greet(&self) -> String {
format!("hello, {}", self.name)
}
}
fn main() {
let user = User { name: "ann" };
let line = user.greet();
println!("{}", line);
}
На экране "hello, ann". Вызов
user.greet() идет как обычный
метод, хотя тело записано в блоке
выполнения трейта, а не в impl User.
Так один тип может выполнить несколько
разных наборов методов разными блоками.
Тот же прием подойдет для второго типа с другим текстом:
trait Greet {
fn greet(&self) -> String;
}
struct Bot {
id: i32,
}
impl Greet for Bot {
fn greet(&self) -> String {
format!("bot {}", self.id)
}
}
fn main() {
let bot = Bot { id: 7 };
let line = bot.greet();
println!("{}", line);
}
Дана структура:
struct Cat {
name: &'static str,
}
let cat = Cat { name: "milo" };
Объявите набор с методом, который возвращает
String вида "cat milo" из
имени, и выполните его для Cat.
Выведите результат вызова.
Дана структура:
struct Room {
number: i32,
}
let room = Room { number: 12 };
Добавьте набор с методом, который возвращает
поле number, выполните его для
Room и выведите число.
Дана структура:
struct Flag {
on: bool,
}
let flag = Flag { on: true };
Запишите набор с методом, который возвращает
on, выполните для Flag
и выведите значение.