什么是类型归属?

时间:2016-04-03 19:17:24

标签: syntax rust ascription

我曾多次使用错误的语法,例如在此示例中忘记使用[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { return $true }

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); | ^^^^^^^^^ 解决了这个问题,但是#34;类型归属"它有什么用?

我找到了issue #23416the feature gate for type ascription,但我无法理解"类型归属"是或者它的目的是什么。

1 个答案:

答案 0 :(得分:31)

类型归属是能够使用我们希望它具有的类型来注释表达式。 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方法可以返回任何实现迭代器Item类型的FromIterator特征的类型。使用类型归属,可以写:

#![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);
}