Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 如何将特征对象传递给向量,该向量在向量的向量中也具有统一类型?_Generics_Vector_Rust_Traits_Trait Objects - Fatal编程技术网

Generics 如何将特征对象传递给向量,该向量在向量的向量中也具有统一类型?

Generics 如何将特征对象传递给向量,该向量在向量的向量中也具有统一类型?,generics,vector,rust,traits,trait-objects,Generics,Vector,Rust,Traits,Trait Objects,这真的很难简明扼要地解释。但我想要的是一个结构,它有一个Vec“a”字段,其中包含一个线程向量,另一个Vec“B”位于Vec“a”内。Vec“A”同时持有Vec“B”和线程句柄。Vec“B”有一个统一的类型,不需要trait对象,但是Vec“a”使用trait对象保存多个不同类型的Vec“B”。基本上,我不想将trait对象用于Vec“B”,而是将trait对象用于Vec“A” 我试图实现上述功能,但并不总是感觉正确和错误。是否有任何实际的实施或任何直接的解决方法 我确实试过搜索它,但我觉得如果

这真的很难简明扼要地解释。但我想要的是一个结构,它有一个Vec“a”字段,其中包含一个线程向量,另一个Vec“B”位于Vec“a”内。Vec“A”同时持有Vec“B”和线程句柄。Vec“B”有一个统一的类型,不需要trait对象,但是Vec“a”使用trait对象保存多个不同类型的Vec“B”。基本上,我不想将trait对象用于Vec“B”,而是将trait对象用于Vec“A”

我试图实现上述功能,但并不总是感觉正确和错误。是否有任何实际的实施或任何直接的解决方法

我确实试过搜索它,但我觉得如果不给谷歌写一小段话,我就不能简明扼要地说出来

下面是我认为应该是这样的(伪)代码:

trait标记{}
u32{}的impl标记
i64{}的impl标记
//向量“B”
输入InnerVec=Vec;
结构线程池{
//Vec“A”
线程:Vec,
}

首先,类型别名不是新类型。它更像是一个查找和替换系统,用于帮助处理长类型名称(例如:
typefoo=FooSys;
)。我怀疑它是否会允许您添加额外的类型约束

至于您的问题,对伪代码最直接的工作解释是将生存期添加到
线程池中

trait标记{}
u32{}的impl标记
i64{}的impl标记
结构线程池>)>,
}
然而,我假设您真正想知道的是如何存储包含非动态项的动态Vec的Vec。为此,您可以使用
Any
并将其向下转换为所需的类型。您可以在中找到有关它的更多信息

使用std::any::any;
结构线程池{
线程:Vec,
}
impl线程池{

pub fn get_tagsI很喜欢你使用Any的方式,但是你认为向下播放
Any
会对性能产生任何重大影响吗?我怀疑你会看到对性能的任何影响。我能想到的唯一开销是检查你请求的类型实际上是给定的类型。但是几乎每种语言都有这样的影响,所以我不会担心在这种情况下,我会避免添加额外的微优化,但如果你真的想,总是有不安全的代码选项,只需将指针转换为你想要的任何东西。
unsafe{Some(&*(self as*const dyn Any as*const T))}