Generics Rust-vec中通用类型的通用

Generics Rust-vec中通用类型的通用,generics,vector,rust,Generics,Vector,Rust,我需要创建一个类似以下代码的Vec: use serde::{Serialize, Deserialize}; trait TPlugin<'a, Config> where Config : Serialize + Deserialize<'a> {} #[derive(Serialize, Deserialize)] struct MyConfig {} struct MyPlugin1 { conf: MyConfig, } impl TPlugin<

我需要创建一个类似以下代码的Vec:

use serde::{Serialize, Deserialize};
trait TPlugin<'a, Config> where Config : Serialize + Deserialize<'a> {}

#[derive(Serialize, Deserialize)]
struct MyConfig {}

struct MyPlugin1 {
  conf: MyConfig,
}
impl TPlugin<MyConfig> for MyPlugin1 {}
impl MyPlugin1 {
  pub fn new() -> MyConfig1 {
    MyConfig1{}
  }
}

fn main() {
  let my_vec: Vec<Box<dyn TPlugin<????>>> = Vec::new();
  my_vec.push(MyConfig1::new());
  my_vec.push(MyConfig2::new());
}

关于。

首先关注核心问题:要拥有异构对象的
Vec
,必须使用动态调度,例如您已经成功使用的
框。但是,在内部,您需要另一个动态调度,而这是不可能的。
最终将成为一个“胖指针”——一个指针指向数据,另一个指针指向该类型的虚拟表。由编译器生成,并包含指向该类型具有的每个方法的实现的指针。问题来了,看看
Serialize
特性:

pub-trait序列化{
fn序列化(&self,序列化程序:S)->结果
其中S:序列化程序;
}
它有一个方法
serialize
,但此方法是
序列化程序
的通用方法。所以实际上没有一个方法,而是“无限”数量的方法,每个可能的
序列化程序都有一个方法。编译器无法为此创建虚拟表,因此无法将
序列化程序
创建为(trait)对象


我建议你定义你自己的特质,它描述了你想用
Config
做什么,并且是什么。例如,使用特定的
序列化程序
toml
保存和加载的方法?

谢谢您的解释。我怀疑这是一件这样的事情。明天我要试试。几年来,我没有做过任何语言的内存操作,我需要努力
let myVec: Vec<TPlugin<?>>;