Return 通用 Vec

Return generic Vec

假设我有这样的结构:

struct A {
    field0: u32,
    field1: Vec<B>,
}

struct B {
    field0: f64,
    field1: String,
    field2: Vec<C>,
}

struct C {
    field0: Vec<u8>,
    field1: bool,
}

我想为每个输出带有 Vec 的字段的结构实现一个特性。

// snip
trait MyVec<T> {
    fn myvec(&self) -> Vec<T>;
}

impl MyVec<T> for A {
    fn myvec(&self) -> Vec<T> { // return Vec<B>
        &self.field1
    }
}
impl MyVec<T> for B {
    fn myvec(&self) -> Vec<T> { // return Vec<C>
        &self.field2
    }
}
impl MyVec<T> for C {
    fn myvec(&self) -> Vec<T> { // return Vec<u8>
        &self.field0
    }
}

但是编译器抱怨 expected type parameter T but found struct B。我该如何正确执行此操作?

抱歉,如果这是一个愚蠢的问题,我是 Rust 的新手,对泛型或特征一无所知。

您需要指定 T。即:

impl MyVec<B> for A {
    fn myvec(&self) -> Vec<B> {
        &self.field1
    }
}

也就是说,A 不会为 任意 T 实现 MyVec<T> - 它只为 [=16= 实现].

您也可以删除类型参数并改用关联类型:

trait MyVec {
    type Item;
    fn myvec(&self) -> Vec<Self::Item>;
}

impl MyVec for A {
    type Item = B;
    fn myvec(&self) -> Vec<B> {
        &self.field1
    }
}