gpt4 book ai didi

generics - 返回通用 Vec

转载 作者:行者123 更新时间:2023-12-03 11:27:24 25 4
gpt4 key购买 nike

假设我有一个这样的结构:

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

但是编译器提示需要类型参数 T 但找到了结构 B。我该如何正确执行此操作?

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

最佳答案

您需要指定 T .即:

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

A没有实现 MyVec<T>对于任意 T - 它只为 B 实现它.

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

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

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

关于generics - 返回通用 Vec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63393987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com