请考虑以下最小示例:
fn foo<T>(arg: T, f: impl FnOnce(i32) -> i32) -> Vec<T> {
let mut x: Vec<T> = Vec::new();
x.push(arg);
println!("{:?}", f(5));
x
}
fn main() {
println!("{:?}", foo::<u32>(5, |i_arg| { i_arg + 5 }));
}
由于使用了impl Trait
而无法编译:
error[E0632]: cannot provide explicit generic arguments when `impl Trait` is used in argument position
--> src/main.rs:10:28
|
10 | println!("{:?}", foo::<u32>(5, |i_arg| { i_arg + 5 }));
| ^^^ explicit generic argument not allowed
error: aborting due to previous error
error: could not compile `generic_functions`.
尽管在另一个参数中使用了T
,我是否有可能为impl Trait
指定类型?我在一个代码库中工作,在这里我需要调用一个使用impl Trait
的泛型函数,但需要指定其他泛型类型。
答案 0 :(得分:2)
从您的示例中,我不明白您为什么要尝试使用turbo鱼。 T
的类型可以根据输入参数arg
确定。无论您以arg
身份传入的内容都是编译器推断为T
的内容。我更新了您的示例,使其正常工作:
fn foo<T>(arg: T, f: impl FnOnce(i32) -> i32) -> Vec<T> {
let mut x: Vec<T> = Vec::new();
x.push(arg);
println!("{:?}", f(5));
x
}
fn main() {
println!("{:?}", foo(5u32, |i_arg| { i_arg + 5 }));
}