Ошибка Rust «ожидаемый тип» печатает несовпадающие типы, которые в точности совпадают - PullRequest
0 голосов
/ 24 января 2019

С ночной ржавчиной:

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

struct Foo<T, F: Fn(&T, &T) -> T> {
    value: T,
    func: F
}

fn main() {
    let lambda = |&x, &y| x + y;
    let foo = Foo {
        value: 5 as i32,
        func: lambda
    };
}

Сообщение об ошибке:

Compiling playground v0.0.1 (/playground)
error[E0308]: mismatched types
 --> src/main.rs:8:15
  |
8 |     let foo = Foo {
  |               ^^^ one type is more general than the other
  |
  = note: expected type `std::ops::FnOnce<(&i32, &i32)>`
             found type `std::ops::FnOnce<(&i32, &i32)>`

Обратите внимание, что ожидаемый тип и найденный типсимвол для персонажа идентичен.Почему в сообщении об ошибке говорится, что один тип является более общим, чем другой, и в то же время говорится, что они одного типа?

1 Ответ

0 голосов
/ 24 января 2019

с ночной ржавчиной:

Это похоже на «плохое» сообщение об ошибке в ночной сборке. В 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.

...