rust 错误E0277遵循书籍示例动态特性,如何在向量中推送动态特性?

szqfcxe2  于 2023-03-02  发布在  其他
关注(0)|答案(1)|浏览(152)

我的真实的案例类似于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();
}
rt4zxlrg

rt4zxlrg1#

你不能解引用&dyn Trait,因为这会在栈上创建未知大小的东西,相反你可以取impl Trait并将其装箱,或者直接取Box<dyn Draw>

fn register(&mut self, w: impl Draw + 'static) {
        self.components.push(Box::new(w));
    }

并传入对象本身而不是对它们的引用:

let b = Button::new("Button1");
    let t = TextBox::new("Some text");
    s.register(b);
    s.register(t);

注意:+ 'static意味着w不能包含任何比'static短的引用,它意味着w必须永远存在。

相关问题