Объект трейта в коробке в 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 item: Box<dyn Greet> = Box::new(User { name: "ann" });
let line = item.greet();
println!("{}", line);
}
Переменная item владеет коробкой, а
коробка указывает на значение, которое
выполняет Greet. Методы трейта
вызывают через ссылку на содержимое, которую
коробка дает автоматически.
Тот же тип коробки подойдет для другой структуры с тем же трейтом:
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 item: Box<dyn Greet> = Box::new(Bot { id: 3 });
println!("{}", item.greet());
}
Даны типы:
trait Greet {
fn greet(&self) -> String;
}
struct Cat {
name: &'static str,
}
Выполните Greet для Cat,
положите значение в коробку с объектом
трейта и выведите строку приветствия.
Даны типы:
trait Label {
fn text(&self) -> &'static str;
}
struct Tag {
name: &'static str,
}
Реализуйте Label, соберите коробку
с объектом и выведите текст подписи.
Скажите, зачем объект трейта часто хранят именно в коробке, а не в обычной переменной на стеке.