此代码编译:
#[derive(Debug, Default)]
struct Example;
impl Example {
fn some_method(&self) {}
}
fn reproduction() -> Example {
let example = Default::default();
// example.some_method();
example
}
如果将注释行添加回来,将导致错误:
error[E0282]: type annotations needed
--> src/lib.rs:10:5
|
9 | let example = Default::default();
| ------- consider giving `example` a type
10 | example.some_method();
| ^^^^^^^ cannot infer type
|
= note: type must be known at this point
为什么添加此方法调用会导致类型推断失败?
我看过这两个问题:
从他们那里,我知道 Rust 使用了 Hindley-Milner 的(修改后的)版本。后一个问题的答案将 Rust 的类型推断描述为方程组。另一个答案明确指出“Rust 中的类型信息可以向后流动”。
使用应用于这种情况的这些知识,我们有:
example
是类型?E
?E
必须有一个名为的方法some_method
?E
被退回- 返回类型是
Example
向后工作,人类很容易看到?E
必须是Example
. 我能看到的和编译器能看到的差距在哪里?