有几次我使用了错误的语法,比如忘记在这个例子中使用let
:
let closure_annotated = |value: i32| -> i32 {
temp: i32 = fun(5i32);
temp + value + 1
};
error[E0658]: type ascription is experimental (see issue #23416) --> src/main.rs:3:9 | 3 | temp: i32 = fun(5i32); | ^^^^^^^^^
我知道这个问题是通过使用let
来解决的,但什么是“类型归属”以及它的用途是什么?
我找到了issue #23416和the feature gate for type ascription,但我无法理解“类型归属”是什么或它的目的是什么。
类型归属是能够使用我们希望它具有的类型来注释表达式。在RFC 803中描述了Rust中的类型归属。
在某些情况下,表达式的类型可能不明确。例如,这段代码:
fn main() {
println!("{:?}", "hello".chars().collect());
}
给出以下错误:
error[E0283]: type annotations required: cannot resolve `_: std::iter::FromIterator<char>`
--> src/main.rs:2:38
|
2 | println!("{:?}", "hello".chars().collect());
| ^^^^^^^
这是因为collect
方法可以返回任何实现迭代器的FromIterator
类型的Item
特征的类型。使用类型归属,可以写:
#![feature(type_ascription)]
fn main() {
println!("{:?}", "hello".chars().collect(): Vec<char>);
}
而不是当前(如Rust 1.33)消除此表达式的歧义:
fn main() {
println!("{:?}", "hello".chars().collect::<Vec<char>>());
}
要么:
fn main() {
let vec: Vec<char> = "hello".chars().collect();
println!("{:?}", vec);
}