繁体   English   中英

Rust - 泛型类型的泛型到 vec

[英]Rust - Generic of generic type into vec

我需要像这样创建一个 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());
}

我必须添加什么代码而不是“????”? 我试过Box<dyn Serialize + Deserialize<'a>>但 rust 告诉我“特性serde::Serialize不能变成一个对象”。

我是 Rust 的新手,所以泛型对我来说很模糊,就像生命周期一样。 我来自 Java/Typescript。 在 Java/Typescript 我写:

let myVec: Vec<TPlugin<?>>;

问候。

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

pub trait Serialize {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where S: Serializer;
}

它有一个方法serialize ,但是这个方法在Serializer是通用的。 所以真的没有一种方法,而是“无限”数量的方法,每个可能的Serializer 编译器无法为此创建虚拟表,因此无法将Serializer制成(特征)对象。

我建议你定义你自己的特征,描述你想用Config做什么并且是对象安全的 也许使用特定的Serializer保存和加载的方法,例如toml

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM