我曾多次使用错误的语法,例如在此示例中忘记使用[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 #23416和the feature gate for type ascription,但我无法理解"类型归属"是或者它的目的是什么。
答案 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);
}