generics - Rust - 将泛型类型的泛型转化为 vec

标签 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<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 ...>最终将成为一个“胖指针”——一个指针指向数据,另一个指针指向该类型的虚拟表。 Virtual table由编译器生成并包含指向该类型具有的每个方法的实现的指针。问题来了,看Serialize特点:

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

它有一个方法 serialize , 但此方法在 Serializer 上通用.所以真的没有一种方法,而是“无限” 种方法,每种方法一种 Serializer .编译器无法为此创建虚拟表,所以 Serializer不能做成(特质)对象。

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

关于generics - Rust - 将泛型类型的泛型转化为 vec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59021265/

相关文章:

c++ - 管理模板派生类型的 vector 集合

java - 如何访问存储在链表集合中的对象的实例变量?

math - 如何从3D向量获得偏航,俯仰和横滚

C++ - 未初始化 vector 的值<int>

functional-programming - 迭代连续折叠结果的惯用和功能方法是什么?

java - 从指定返回 Collection<ParentType> 的方法返回 Collection<ChildType>

vector - java.lang.OutOfMemoryError : Java heap space error while running seq2sparse in mahout 错误

rust - Rust中的 move 语义是什么?

parallel-processing - 将 crossbeam 作用域线程与向量 block 结合使用

generics - 具有静态约束的泛型类型的 F# 单例