如何返回包含泛型值的向量



我正在尝试从函数返回向量,但编译器给了我以下错误消息:

 expected `Foo<T>`,
    found `Foo<&str>`
(expected type parameter,
    found &-ptr) [E0308]

我在这里错过了什么?

struct Foo<T> {
    bar: T,
}

fn foos<T>() -> Vec<Foo<T>> {
    vec![
        Foo { bar: "x" },
        Foo { bar: 1 },
    ]
}

fn main() {
    let my_foos: Vec<_> = foos();
    println!("{}", my_foos[0].bar);
}

编译器在这里给你一个很好的错误消息:

expected `Foo<T>`,
   found `Foo<&str>`

也就是说,您不是返回一些泛型T,而是返回一个具体类型。实际上,您不只是返回一种类型,而是在尝试返回两种不同的类型!

每次解析泛型时,它都必须解析为单个类型。也就是说,您可以使用两个u32或两个bool来调用foo<T>(a: T, b: T),但不能使用其中之一。

若要使代码以最直接的方式工作,可以使用枚举。这将创建一个可以具有一组值之一的单个类型:

struct Foo<T> {
    bar: T,
}
#[derive(Debug)]
enum Bar<'a> {
    Num(i32),
    Str(&'a str),
}
// Note no generics here, we specify the concrete type that this `Foo` is
fn foos() -> Vec<Foo<Bar<'static>>> {
    vec![
        Foo { bar: Bar::Str("x") },
        Foo { bar: Bar::Num(1) },
    ]
}
fn main() {
    let my_foos: Vec<_> = foos();
    println!("{:?}", my_foos[0].bar);
}

最新更新