벡터의 벡터에서 균일 한 유형을 가질 벡터에 trait 객체를 어떻게 전달합니까?

Aug 16 2020

간결하게 설명하기가 정말 어렵습니다. 그러나 내가 원하는 것은 Vec "A"내부에 또 다른 Vec "B"가있는 스레드의 벡터를 포함하는 Vec "A"필드가있는 구조체입니다. Vec "A"는 Vec "B"와 스레드 핸들을 모두 보유합니다. Vec "B"는 특성 개체가 필요없는 균일 한 유형을 가지고 있지만 Vec "A"는 특성 개체를 사용하여 여러 다른 유형의 Vec "B"를 보유합니다. 기본적으로 Vec "B"에는 특성 개체를 사용하지 않고 Vec "A"에는 특성 개체를 사용하고 싶습니다.

위의 구현을 시도했지만 항상 옳고 오류가 있다고 느끼지는 않습니다. 이것의 실제 구현이나 이것에 대한 직접적인 해결 방법이 있습니까?

검색을 해봤지만 구글에 짧은 문단을 쓰지 않고는 간결하게 말을 할 수없는 것 같다.

내가 생각하는 (의사) 코드는 다음과 같습니다.

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

답변

1 Locke Aug 16 2020 at 07:57

따라서 먼저 유형 별칭은 새로운 유형이 아닙니다. 긴 유형 이름 (예 :)을 지원하는 찾기 및 바꾸기 시스템과 더 비슷합니다 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>>)>,
}

그러나 내가 정말로 알고 싶어하는 것은 비 동적 항목을 포함하는 동적 Vec의 Vec를 저장하는 방법입니다. 이를 위해 Any원하는 유형으로 사용 하고 다운 캐스트 할 수 있습니다 . 문서 에서 더 많은 정보를 찾을 수 있습니다 .

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