Метод по умолчанию в трейте в Rust
Метод в трейте может уже иметь тело, и тип его не повторяет. Общую логику кладут в описание набора, а в блоке выполнения оставляют только те методы, где нужен свой вариант поведения.
Зададим приветствие с готовым шаблоном и одним методом, который тип все же должен дописать:
trait Greet {
fn name(&self) -> &'static str;
fn greet(&self) -> String {
format!("hello, {}", self.name())
}
}
struct User {
name: &'static str,
}
impl Greet for User {
fn name(&self) -> &'static str {
self.name
}
}
fn main() {
let user = User { name: "ann" };
let line = user.greet();
println!("{}", line);
}
На экране снова "hello, ann". Метод
greet вызывает name через
self, хотя тело greet
записано только в трейте. Для User
достаточно вернуть поле в name.
При необходимости тип может переопределить и метод с телом по умолчанию:
trait Greet {
fn greet(&self) -> String {
String::from("hi")
}
}
struct Bot {
id: i32,
}
impl Greet for Bot {
fn greet(&self) -> String {
format!("bot {}", self.id)
}
}
fn main() {
let bot = Bot { id: 3 };
let line = bot.greet();
println!("{}", line);
}
Дана структура:
struct Item {
label: &'static str,
}
let item = Item { label: "box" };
Объявите набор: метод с телом возвращает
String "item", второй метод
без тела отдает label. Выполните
набор для Item, допишите только
второй метод, выведите оба результата
вызова.
Дана структура:
struct Pair {
a: i32,
b: i32,
}
let pair = Pair { a: 2, b: 5 };
Запишите набор с методом по умолчанию,
который возвращает сумму a и b,
и выполните его для Pair без
повторения этого метода. Выведите сумму.
Дана структура:
struct Mode {
code: i32,
}
let mode = Mode { code: 9 };
Сделайте набор с методом по умолчанию
"mode" и переопределите его для
Mode, чтобы вернуть String
с числом code. Выведите строку.