我的真实的案例类似于Rust文档中关于dyn trait与Screen和Draw trait的内容,所以我构建了一个与书中完全类似的示例,但不是在适当的位置初始化向量,而是需要一个register函数来将组件推入向量,但我得到了错误:trait Sized
没有为dyn Draw
实现我不知道如何修复它...
pub trait Draw {
fn draw(&self);
}
pub struct Screen {
pub components: Vec<Box<dyn Draw>>,
}
impl Screen {
fn new() -> Self {
Screen {
components: Vec::new(),
}
}
fn register(&mut self, w: &dyn Draw) {
self.components.push(Box::new(*w));
}
fn show(&self) {
for d in self.components {
d.draw()
}
}
}
struct TextBox {
txt: String,
}
impl TextBox {
fn new(t: &str) -> Self {
TextBox { txt: t.to_string() }
}
}
struct Button {
label: String,
}
impl Button {
fn new(l: &str) -> Self {
Button {
label: l.to_string(),
}
}
}
impl Draw for TextBox {
fn draw(&self) {
println!("{}", self.txt.as_str())
}
}
impl Draw for Button {
fn draw(&self) {
println!("{}", self.label.as_str())
}
}
fn main() {
let s = Screen::new();
let b = Button::new("Button1");
let t = TextBox::new("Some text");
s.register(&b as &dyn Draw);
s.register(&t as &dyn Draw);
s.show();
}
1条答案
按热度按时间rt4zxlrg1#
你不能解引用
&dyn Trait
,因为这会在栈上创建未知大小的东西,相反你可以取impl Trait
并将其装箱,或者直接取Box<dyn Draw>
:并传入对象本身而不是对它们的引用:
注意:
+ 'static
意味着w
不能包含任何比'static
短的引用,它不意味着w
必须永远存在。