Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpDyBx 36 of 288 menu
◀ ▶

Объект трейта в коробке в 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, соберите коробку с объектом и выведите текст подписи.

Скажите, зачем объект трейта часто хранят именно в коробке, а не в обычной переменной на стеке.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить