Rust“预期类型”错误打印完全相同的不匹配类型

Jer*_*wen 6 typechecking lifetime rust

夜间生锈:

操场

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
    };
}
Run Code Online (Sandbox Code Playgroud)

错误信息:

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
    };
}
Run Code Online (Sandbox Code Playgroud)

请注意,预期类型和找到的类型是相同的字符。为什么错误消息说一种类型比另一种更通用,同时还说它们是同一类型?

Pet*_*all 3

\n

夜间生锈:

\n
\n\n

这似乎只是夜间构建中的“坏”错误消息。在 Rust 1.32(稳定)中,错误告诉您这是生命周期不匹配:

\n\n
error[E0631]: type mismatch in closure arguments\n --> src/main.rs:8:15\n  |\n7 |     let lambda = |&x, &y| x + y;\n  |                  -------------- found signature of `fn(&_, &_) -> _`\n8 |     let foo = Foo {\n  |               ^^^ expected signature of `for<\'r, \'s> fn(&\'r i32, &\'s i32) -> _`\n  |\nnote: required by `Foo`\n --> src/main.rs:1:1\n  |\n1 | struct Foo<T, F: Fn(&T, &T) -> T> {\n  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nerror[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`\n --> src/main.rs:8:15\n  |\n8 |     let foo = Foo {\n  |               ^^^ expected bound lifetime parameter, found concrete lifetime\n  |\nnote: required by `Foo`\n --> src/main.rs:1:1\n  |\n1 | struct Foo<T, F: Fn(&T, &T) -> T> {\n  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

为什么错误消息说一种类型比另一种类型更通用,同时又说它们是同一类型?

\n
\n\n

这些类型仅在生命周期方面有所不同。每晚消息不包含生命周期 \xe2\x80\x94 ,可能是为了在生命周期不相关的情况下减少噪音。显然,当生命周期是类型之间的唯一区别时,这根本没有帮助。

\n\n

考虑向 Rust 团队报告错误。

\n

  • @VikramFugro 它之所以有效,是因为您已经告诉编译器“T”是“i32”,一种不包含引用的类型,因此“T:'static”。 (2认同)