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
}
}
假设我有这样的结构:
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
}
}