с ночной ржавчиной:
Это похоже на «плохое» сообщение об ошибке в ночной сборке. В Rust 1.32 (стабильный) ошибки говорят вам, что это несоответствие времени жизни:
error[E0631]: type mismatch in closure arguments
--> src/main.rs:8:15
|
7 | let lambda = |&x, &y| x + y;
| -------------- found signature of `fn(&_, &_) -> _`
8 | let foo = Foo {
| ^^^ expected signature of `for<'r, 's> fn(&'r i32, &'s i32) -> _`
|
note: required by `Foo`
--> src/main.rs:1:1
|
1 | struct Foo<T, F: Fn(&T, &T) -> T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0271]: type mismatch resolving `for<'r, 's> <[closure@src/main.rs:7:18: 7:32] as std::ops::FnOnce<(&'r i32, &'s i32)>>::Output == i32`
--> src/main.rs:8:15
|
8 | let foo = Foo {
| ^^^ expected bound lifetime parameter, found concrete lifetime
|
note: required by `Foo`
--> src/main.rs:1:1
|
1 | struct Foo<T, F: Fn(&T, &T) -> T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Почему в сообщении об ошибке говорится, что один тип является более общим, чем другой, и в то же время говорится, что они одного типа?
Типы отличаются только временем жизни. Ночное сообщение не включает время жизни - возможно, в попытке уменьшить шум в тех случаях, когда время жизни не имеет значения. Очевидно, что это совсем не полезно, когда продолжительность жизни - единственное различие между типами.
Рассмотрим сообщение об ошибке команде Rust.