Como faço para passar um objeto de característica para um vetor que também terá um tipo uniforme no vetor do vetor?
Isso é realmente difícil de explicar de forma concisa. Mas o que eu quero é uma estrutura que tenha um campo de Vec "A" contendo um vetor de threads com outro Vec "B" dentro do Vec "A". Vec "A" segura tanto o Vec "B" quanto o cabo de rosca. Vec "B" tem um tipo uniforme, sem necessidade de objetos de característica, mas Vec "A" contém vários tipos diferentes de Vec "B" usando objetos de característica. Basicamente, eu não quero usar objetos de característica para Vec "B", mas uso objetos de característica para Vec "A".
Tentei implementar o acima, mas nem sempre parece certo e com erros. Existe alguma implementação real disso ou alguma solução alternativa direta para isso?
Eu tentei pesquisar, mas sinto que não posso formular de forma concisa sem escrever um pequeno parágrafo para o Google.
Aqui está o (pseudo-) código de como eu acho que deveria ser:
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>)>,
}
Respostas
Portanto, primeiro, um alias de tipo não é um novo tipo. É mais como um sistema de localização e substituição para ajudar com nomes de tipo longos (Ex:) type Foo<T> = FooSys<T, Vec<T>, u32>;
. Duvido que algum dia você possa adicionar outras restrições de tipo.
Quanto ao seu problema, a interpretação de trabalho mais direta do seu pseudocódigo seria adicionar uma vida inteira ao ThreadPool
.
trait Tag {}
impl Tag for u32 {}
impl Tag for i64 {}
struct ThreadPool<'a> {
threads: Vec<(JoinHandle<()>, Vec<Box<dyn Tag + 'a>>)>,
}
No entanto, o que presumo que você realmente queira saber é como armazenar um Vec de Vecs dinâmicos contendo itens não dinâmicos. Para fazer isso, você pode usar Any
e reduzir para o tipo desejado. Você pode encontrar mais informações sobre isso nos documentos .
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()
}
}