Предоставить явную спецификацию типа, несмотря на аргумент impl Trait - PullRequest
0 голосов
/ 08 мая 2020

Рассмотрим следующий минимальный пример:

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 в другом аргументе? Я работаю в кодовой базе, где мне нужно вызвать общую функцию c, которая использует impl Trait, но мне нужно указать другие общие типы c.

1 Ответ

2 голосов
/ 08 мая 2020

Из вашего примера я не понимаю, зачем вы пытаетесь использовать turbofi sh. Тип 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 }));
}

детская площадка

...