Ответ 1
Типовое присвоение - это возможность аннотировать выражение с типом, который мы хотим иметь. Тип заявки в Rust описан в RFC 803.
В некоторых ситуациях тип выражения может быть неоднозначным. Например, этот код:
fn main() {
println!("{:?}", "hello".chars().collect());
}
дает следующую ошибку:
<anon>:2:38: 2:47 error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [E0282]
<anon>:2 println!("{:?}", "hello".chars().collect());
^~~~~~~~~
Это потому, что метод collect
может возвращать любой тип, который реализует свойство FromIterator
для тип iterator Item
. С типом присваивания можно написать:
fn main() {
println!("{:?}", "hello".chars().collect(): Vec<char>);
}
Вместо текущего (как и у Rust 1.7) способов устранения двусмысленности этого выражения:
fn main() {
println!("{:?}", "hello".chars().collect::<Vec<char>>());
}
или
fn main() {
let vec: Vec<char> = "hello".chars().collect();
println!("{:?}", vec);
}