Bir özellik nesnesini, vektörün vektöründe de tek tip bir türe sahip olacak bir vektöre nasıl geçiririm?
Bunu kısaca açıklamak gerçekten zor. Ama istediğim şey, Vec "A" içinde başka bir Vec "B" ile iş parçacığı vektörünü içeren bir Vec "A" alanına sahip bir yapı. Vec "A" hem Vec "B" hem de iplik tutamacını tutar. Vec "B" tek tip bir türe sahiptir, özellik nesnelerine ihtiyaç yoktur, ancak Vec "A", özellik nesnelerini kullanan birden çok farklı Vec "B" türünü tutar. Temel olarak, Vec "B" için özellik nesneleri kullanmak istemiyorum, ancak Vec "A" için özellik nesneleri kullanmak istemiyorum.
Yukarıdakileri uygulamaya çalıştım ama her zaman doğru ve yanlış hissettirmiyor. Bunun gerçek bir uygulaması veya bunun herhangi bir doğrudan çözümü var mı?
Aramayı denedim ama Google'a kısa bir paragraf yazmadan kısaca kelimesi kelimesine yazamayacağımı hissediyorum.
İşte nasıl olması gerektiğini düşündüğüm (sözde) kodu:
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>)>,
}
Yanıtlar
Öncelikle, tür takma adı yeni bir tür değildir. Daha çok, uzun tip adlara yardımcı olacak bir bulma ve değiştirme sistemi gibidir (Örn:) type Foo<T> = FooSys<T, Vec<T>, u32>;
. Ek tür kısıtlamaları eklemenize izin vereceğinden şüpheliyim.
Sorununuza gelince, sözde kodunuzun en doğrudan çalışan yorumu ThreadPool
,.
trait Tag {}
impl Tag for u32 {}
impl Tag for i64 {}
struct ThreadPool<'a> {
threads: Vec<(JoinHandle<()>, Vec<Box<dyn Tag + 'a>>)>,
}
Ancak, gerçekten bilmek istediğinizi varsaydığım şey, dinamik olmayan öğeler içeren dinamik Vec'lerin nasıl saklanacağıdır. Bunu yapmak için kullanabilir Any
ve istediğiniz türe indirgeyebilirsiniz. Dokümanlarda bununla ilgili daha fazla bilgi bulabilirsiniz .
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()
}
}