什么是类型归属?

问题描述 投票:22回答:1

有几次我使用了错误的语法,比如忘记在这个例子中使用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 #23416the feature gate for type ascription,但我无法理解“类型归属”是什么或它的目的是什么。

syntax rust ascription
1个回答
32
投票

类型归属是能够使用我们希望它具有的类型来注释表达式。在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);
}
© www.soinside.com 2019 - 2024. All rights reserved.