如何将特征对象传递给向量,该向量在向量的向量中也具有统一类型?
How do I pass in a trait object to a vector that will also have a uniform type in the vector of the vector?
这个真的很难说清楚。但我想要的是一个结构,它有一个 Vec“A”字段,其中包含一个线程向量,在 Vec“A”内有另一个 Vec“B”。 Vec "A" 包含 Vec "B" 和线程句柄。 Vec "B" 有一个统一的类型,不需要 trait 对象,但是 Vec "A" 使用 trait 对象持有多个不同类型的 Vec "B"。基本上我不想为 Vec“B”使用特征对象,而是为 Vec“A”使用特征对象。
我尝试实现以上内容,但感觉并不总是正确和错误。是否有任何实际实施或任何直接解决方法?
我确实尝试过搜索它,但我觉得如果不写一个简短的段落给 Google,我就无法简明扼要地表达它。
这是我认为应该是这样的(伪)代码:
trait Tag {}
impl Tag for u32 {}
impl Tag for i64 {}
// Vec "B"
type InnerVec<T: Tag> = Vec<T>;
struct ThreadPool {
// Vec "A"
threads: Vec<(JoinHandle<()>, InnerVec<dyn Tag>)>,
}
所以首先,类型别名不是新类型。它更像是一个查找和替换系统,可以帮助处理长类型名称(例如:type Foo<T> = FooSys<T, Vec<T>, u32>;
)。我怀疑它是否会允许您添加额外的类型约束。
至于您的问题,对您的伪代码最直接的工作解释是为 ThreadPool
添加生命周期。
trait Tag {}
impl Tag for u32 {}
impl Tag for i64 {}
struct ThreadPool<'a> {
threads: Vec<(JoinHandle<()>, Vec<Box<dyn Tag + 'a>>)>,
}
但是我假设您真正想知道的是如何存储包含 non-dynamic 项的动态 Vec 的 Vec。为此,您可以使用 Any
并将其向下转型为您想要的类型。您可以在 docs.
中找到更多信息
use std::any::Any;
struct ThreadPool {
threads: Vec<(JoinHandle<()>, Box<dyn Any>)>,
}
impl ThreadPool {
pub fn get_tags<T: 'static>(&self, index: usize) -> Option<&Vec<T>> {
let (_, ref boxed) = self.threads[index];
boxed.downcast_ref()
}
}
这个真的很难说清楚。但我想要的是一个结构,它有一个 Vec“A”字段,其中包含一个线程向量,在 Vec“A”内有另一个 Vec“B”。 Vec "A" 包含 Vec "B" 和线程句柄。 Vec "B" 有一个统一的类型,不需要 trait 对象,但是 Vec "A" 使用 trait 对象持有多个不同类型的 Vec "B"。基本上我不想为 Vec“B”使用特征对象,而是为 Vec“A”使用特征对象。
我尝试实现以上内容,但感觉并不总是正确和错误。是否有任何实际实施或任何直接解决方法?
我确实尝试过搜索它,但我觉得如果不写一个简短的段落给 Google,我就无法简明扼要地表达它。
这是我认为应该是这样的(伪)代码:
trait Tag {}
impl Tag for u32 {}
impl Tag for i64 {}
// Vec "B"
type InnerVec<T: Tag> = Vec<T>;
struct ThreadPool {
// Vec "A"
threads: Vec<(JoinHandle<()>, InnerVec<dyn Tag>)>,
}
所以首先,类型别名不是新类型。它更像是一个查找和替换系统,可以帮助处理长类型名称(例如:type Foo<T> = FooSys<T, Vec<T>, u32>;
)。我怀疑它是否会允许您添加额外的类型约束。
至于您的问题,对您的伪代码最直接的工作解释是为 ThreadPool
添加生命周期。
trait Tag {}
impl Tag for u32 {}
impl Tag for i64 {}
struct ThreadPool<'a> {
threads: Vec<(JoinHandle<()>, Vec<Box<dyn Tag + 'a>>)>,
}
但是我假设您真正想知道的是如何存储包含 non-dynamic 项的动态 Vec 的 Vec。为此,您可以使用 Any
并将其向下转型为您想要的类型。您可以在 docs.
use std::any::Any;
struct ThreadPool {
threads: Vec<(JoinHandle<()>, Box<dyn Any>)>,
}
impl ThreadPool {
pub fn get_tags<T: 'static>(&self, index: usize) -> Option<&Vec<T>> {
let (_, ref boxed) = self.threads[index];
boxed.downcast_ref()
}
}