如何 return 包含通用值的向量
How to return a vector containing generic values
我正在尝试 return 来自函数的向量,但编译器给我以下错误消息:
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>`
也就是说,您 return 不是一些泛型 T
,而是 return 具体类型。实际上,您 return 不只是一种类型,您正在尝试 return 两种 不同的 类型!
每次解析泛型时,它都必须解析为单一类型。也就是说,您可以用两个 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);
}
我正在尝试 return 来自函数的向量,但编译器给我以下错误消息:
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>`
也就是说,您 return 不是一些泛型 T
,而是 return 具体类型。实际上,您 return 不只是一种类型,您正在尝试 return 两种 不同的 类型!
每次解析泛型时,它都必须解析为单一类型。也就是说,您可以用两个 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);
}