返回通用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不会为任意 MyVec<T>实现T-它只会为B实施。

您还可以删除type参数并改用关联的类型:

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...