Bagaimana cara mengirimkan objek sifat ke vektor yang juga akan memiliki tipe seragam dalam vektor vektor?

Aug 16 2020

Ini sangat sulit untuk dijelaskan secara ringkas. Tapi yang saya inginkan adalah struct yang memiliki bidang Vec "A" yang berisi vektor utas dengan Vec "B" lain di dalam Vec "A". Vec "A" memegang Vec "B" dan pegangan benang. Vec "B" memiliki tipe seragam, tidak perlu objek sifat, tetapi Vec "A" menampung beberapa tipe berbeda dari Vec "B" menggunakan objek sifat. Pada dasarnya saya tidak ingin menggunakan objek sifat untuk Vec "B" tetapi menggunakan objek sifat untuk Vec "A".

Saya mencoba menerapkan hal di atas tetapi tidak selalu terasa benar dan error. Apakah ada implementasi aktual dari ini atau solusi langsung untuk ini?

Saya memang mencoba mencarinya tetapi saya merasa tidak bisa mengatakannya secara ringkas tanpa menulis paragraf pendek ke Google.

Inilah kode (pseudo-) dari apa yang menurut saya seharusnya seperti itu:

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>)>,
}

Jawaban

1 Locke Aug 16 2020 at 07:57

Jadi pertama-tama, alias tipe bukanlah tipe baru. Ini lebih seperti menemukan dan mengganti sistem untuk membantu dengan nama tipe yang panjang (Mis:) type Foo<T> = FooSys<T, Vec<T>, u32>;. Saya ragu ini akan memungkinkan Anda untuk menambahkan batasan tipe tambahan.

Adapun masalah Anda, interpretasi yang paling langsung berfungsi dari kode semu Anda akan menambahkan seumur hidup ke ThreadPool.

trait Tag {}

impl Tag for u32 {}
impl Tag for i64 {}


struct ThreadPool<'a> {
    threads: Vec<(JoinHandle<()>, Vec<Box<dyn Tag + 'a>>)>,
}

Namun apa yang saya anggap Anda benar-benar ingin tahu adalah bagaimana menyimpan Vec dari Vec dinamis yang berisi item non-dinamis. Untuk melakukan ini, Anda dapat menggunakan Anydan menurunkannya ke dalam tipe yang Anda inginkan. Anda dapat menemukan info lebih lanjut tentangnya di dokumen .

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()
    }
}