尽管提供了“ impl Trait”参数,但仍提供了明确的类型规范

时间:2020-05-07 21:12:44

标签: generics rust traits

请考虑以下最小示例:

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的泛型函数,但需要指定其他泛型类型。

1 个答案:

答案 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 }));
}

playground