Generics 将泛型用作集合内函数的参数

Generics 将泛型用作集合内函数的参数,generics,types,rust,traits,Generics,Types,Rust,Traits,我试图在结构的HashMap中存储几个函数。 如果我使用实体类型,它会起作用: extern crate bson; extern crate serde; use std::sync::Arc; use std::collections::HashMap; type CBack = Fn(Vec<bson::Array>) -> Vec<u8> + Send + Sync + 'static; struct Struct { cback_map: H

我试图在结构的HashMap中存储几个函数。 如果我使用实体类型,它会起作用:

extern crate bson;
extern crate serde;

use std::sync::Arc;
use std::collections::HashMap;

type CBack = Fn(Vec<bson::Array>) -> Vec<u8> + Send + Sync + 'static;

struct Struct {
    cback_map: HashMap<String, Arc<CBack>>
}

fn main() {}
外部板条箱bson;
外部板条箱;
使用std::sync::Arc;
使用std::collections::HashMap;
输入CBack=Fn(Vec)->Vec+Send+Sync+'静态;
结构{
cback_映射:HashMap
}
fn main(){}
当我开始对参数和闭包的返回类型使用泛型时,编译器开始抱怨对象没有调整大小等等。相反,我希望我的映射包含具有以下签名的闭包:

fn fun<'de, D, R>(_: D) -> R
   where D: serde::Deserialize<'de>, R: serde::Serialize {}
fn fun,R:serde::Serialize{}

如何正确定义该映射?

如果您需要将映射定义为异构的,即保存用不同类型实例化的函数的不同版本,则需要更改其签名

对于任何给定类型
R
,如果该类型的大小为
大小
,则此功能将起作用。但是对于所有可能的
R
s,编译器都无法知道大小,因为每个大小都可能不同

要使其正常工作,您需要使用trait对象,如
Box
&Serialize


你也可能有其他问题。但是,您的问题和代码示例不够完整,无法进行我在上面所做的观察,与“对象未调整大小等”相关。

“编译器开始抱怨”如果您提供这些抱怨,将更容易提供帮助。:)我还想知道主要的上下文是什么,因为最后一个函数签名与您之前提到的完全不同。我说编译器开始抱怨,因为一开始是因为没有调整大小,如果没有同步或发送,就不能用“+”指定其他特征,这是关于不能在这种情况下使用泛型,等等。在你的问题中,你没有告诉我们是什么样的代码导致了这个问题。您所做的只是向我们展示有效的代码,然后说“如果我添加了一些泛型,我会得到一些错误”,而没有展示这些泛型是如何添加的,或者生成的确切完整错误。我想这个框会有所帮助,但接下来会出现另一个问题。反序列化需要一个生存期参数,该参数引用函数的参数。绝对不能在整个地图上共享一个生命周期,这是一个漏洞。是否有可能为每个函数分别声明生命周期?“但随后又出现了另一个问题”-这就是为什么没有一个单独的生命周期,任何人都很难有效地帮助您的原因。