无法在Vec中将特征变成对象

时间:2019-08-28 10:26:25

标签: vector rust traits

我有以下代码:

pub trait Handler<T: Clone>: Clone {
    fn invoke(&self) -> Result<(), std::io::Error>;
}

#[derive(Clone)]
pub struct App<T: Clone> {
    handlers: Vec<Box<dyn Handler<T>>>,
}

fn main() -> Result<(), std::io::Error> {
    #[derive(Clone)]
    struct MyHandler<T: Clone> { tt: T }

    impl<T: Clone> Handler<T> for MyHandler<T> {
        fn invoke(&self) -> Result<(), std::io::Error> { () }
    }

    let app = App { handlers: vec![ MyHandler{ tt: 0 }, MyHandler{ tt: 5 } ] };

这会产生编译错误:

error[E0038]: the trait `Handler` cannot be made into an object
 --> src/main.rs:8:5
  |
8 |     handlers: Vec<Box<dyn Handler<T>>>,
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Handler` cannot be made into an object
  |
  = note: the trait cannot require that `Self : Sized`

即使我不尝试将特征转换为具体对象。 我不明白:box结构应该允许我存储未知大小的类型。

目标是存储Vec个实现者中的一个Handler,以便为所有对象提供invoke方法。

0 个答案:

没有答案