33

有几次我使用了错误的语法,比如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);
  |         ^^^^^^^^^

我知道这个问题是通过 using 解决的let,但是什么是“类型归属”,它的用途是什么?

我发现了issue #23416type ascription 的特性门,但我不明白什么是“type ascription”或它的目的是什么。

4

1 回答 1

46

类型归属是用我们希望它具有的类型注释表达式的能力。Rust 中的类型归属在RFC 803中进行了描述。

在某些情况下,表达式的类型可能不明确。例如,这段代码:

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);
}
于 2016-04-03T19:30:39.623 回答