Come si passa un oggetto tratto a un vettore che avrà anche un tipo uniforme nel vettore del vettore?
Questo è davvero difficile da spiegare in modo conciso. Ma quello che voglio è una struttura che abbia un campo di Vec "A" contenente un vettore di thread con un altro Vec "B" all'interno di Vec "A". Vec "A" contiene sia il Vec "B" e la maniglia del filo. Vec "B" ha un tipo uniforme, non necessita di oggetti tratto, ma Vec "A" contiene diversi tipi diversi di Vec "B" utilizzando oggetti tratto. Fondamentalmente non voglio usare oggetti tratto per Vec "B" ma usare oggetti tratto per Vec "A".
Ho provato a implementare quanto sopra ma non sempre mi sembra giusto e gli errori. Esiste un'implementazione effettiva di questo o una soluzione alternativa diretta a questo?
Ho provato a cercarlo ma mi sento come se non potessi esprimerlo in modo conciso senza scrivere un breve paragrafo a Google.
Ecco il (pseudo-) codice di come penso dovrebbe essere:
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>)>,
}
Risposte
Quindi, prima di tutto, un alias di tipo non è un nuovo tipo. È più simile a un sistema di ricerca e sostituzione per aiutare con nomi di tipi lunghi (Es:) type Foo<T> = FooSys<T, Vec<T>, u32>;
. Dubito che ti consentirà mai di aggiungere ulteriori vincoli di tipo.
Per quanto riguarda il tuo problema, l'interpretazione funzionante più diretta del tuo pseudo codice sarebbe l'aggiunta di una vita al file ThreadPool
.
trait Tag {}
impl Tag for u32 {}
impl Tag for i64 {}
struct ThreadPool<'a> {
threads: Vec<(JoinHandle<()>, Vec<Box<dyn Tag + 'a>>)>,
}
Tuttavia quello che presumo che tu voglia davvero sapere è come memorizzare un Vec di Vec dinamici contenenti elementi non dinamici. Per fare questo puoi usarlo Any
e abbassarlo nel tipo che desideri. Puoi trovare maggiori informazioni su di esso nei documenti .
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()
}
}