Description
Current Behavior
Given the following code:
let mut combinations = (1..2).combinations();
assert_eq!(combinations.next(), None);
where Iterator::combinations
is defined as:
fn combinations<const N: usize>(self) -> Combinations<Self, N>;
The following diagnostic is provided:
error[E0282]: type annotations needed
--> src\lib.rs:144:32
|
144 | let mut combinations = (1..2).combinations();
| ^^^^^^^^^^^^^^^^^^^^^
|
= note: unable to infer the value of a const parameter
Attempting a fix, and failing:
Naively I thought I could fix this by adding a turbofish, but that doesn't seem to help:
let mut combinations = (1..2).combinations::<[usize; 2]>();
assert_eq!(combinations.next(), None);
error[E0107]: wrong number of const arguments: expected 1, found 0
--> src\lib.rs:144:39
|
144 | let mut combinations = (1..2).combinations::<[usize; 2]>();
| ^^^^^^^^^^^^ expected 1 const argument
error[E0107]: wrong number of type arguments: expected 0, found 1
--> src\lib.rs:144:54
|
144 | let mut combinations = (1..2).combinations::<[usize; 2]>();
| ^^^^^^^^^^ unexpected type argument
Expected behavior
Providing a hint on how to correctly define const generics would be immensely helpful. I'm sure I'll be able to figure out the syntax for this eventually (currently going through #78460 among others), but given we're set for a 1.51 stabilization of min_const_generics
I suspect more people will be running into this soon.
Further Considerations
I was looking at how hints work for e.g. missing type params in collect
, and noticed no hints are provided there either. It only explains what to do, not showing how to do it. For something that's notoriously tricky to learn that seems like it could benefit from hints as well.
let x = (1..5).collect();
error[E0282]: type annotations needed
--> src/main.rs:2:9
|
2 | let x = (1..5).collect();
| ^ consider giving `x` a type