Rust 错误码 E0283

Rust 错误码 E0283
1let args = env::args().collect(); // error

编译器无法推断类型,要求提供类型注解。

错误代码示例:

1let x = "hello".chars().rev().collect();

该错误表明编译器无法推断出类型,或者可能有多个类型,需要额外的信息。 在大多数情况下可以通过添加类型注解来提供。有时您需要手动指定一个通用类型参数。

一个常见的例子是 Iterator 上的 collect 方法。它有一个通用类型 参数,对于一个 char 迭代器来说,该参数是由 VecName 实现的。 和 String 等实现。请看以下将字符串中的字符反转的示例:

在第一个代码示例中,编译器无法推断出 x 的类型应该是应该是什么类型: Vec<char>String都是合适的候选类型。要指定使用哪种类型,可以在 x 上使用类型注解:

1let x: Vec<char> = "hello".chars().rev().collect();

无需注释完整类型。一旦解决了模棱两可的问题,编译器就能推断出其余部分:

1let x: Vec<_> = "hello".chars().rev().collect();

另一种为编译器提供足够信息的方法是指定通用类型参数:

1let x = "hello".chars().rev().collect::<Vec<char>>();

同样,如果编译器能推断出完整类型,则无需指定:

1let x = "hello".chars().rev().collect::<Vec<_>>();

我们可以看到下面一个独立的示例:

1struct Foo;
2
3impl Into<u32> for Foo {
4    fn into(self) -> u32 { 1 }
5}
6
7let foo = Foo;
8let bar: u32 = foo.into() * 1u32;

这个错误可以通过添加类型注解来解决。 信息。在这种情况下,解决办法是指定 trait 的类型参数:

1struct Foo;
2
3impl Into<u32> for Foo {
4    fn into(self) -> u32 { 1 }
5}
6
7let foo = Foo;
8let bar: u32 = Into::<u32>::into(foo) * 1u32;