Plusieurs fois, j'ai utilisé la mauvaise syntaxe, comme oublier d'utiliser let
dans cet exemple:
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); | ^^^^^^^^^
Je sais que ce problème est résolu en utilisant let
, mais qu'est-ce que "type ascription" et quelle est son utilisation?
J'ai trouvé problème # 23416 et la porte de fonctionnalité pour l'attribution de type , mais je ne pouvais pas comprendre ce qu'est "l'attribution de type" ou quel est son but.
L'attribution de type est la capacité d'annoter une expression avec le type que nous voulons qu'elle ait. Tapez ascription dans Rust est décrit dans RFC 8 .
Dans certaines situations, le type d'une expression peut être ambigu. Par exemple, ce code:
fn main() {
println!("{:?}", "hello".chars().collect());
}
donne l'erreur suivante:
error[E0283]: type annotations required: cannot resolve `_: std::iter::FromIterator<char>`
--> src/main.rs:2:38
|
2 | println!("{:?}", "hello".chars().collect());
| ^^^^^^^
En effet, la méthode collect
peut renvoyer tout type qui implémente le trait FromIterator
pour le type Item
de l'itérateur. Avec l'attribution de type, on pourrait écrire:
#![feature(type_ascription)]
fn main() {
println!("{:?}", "hello".chars().collect(): Vec<char>);
}
Au lieu des façons actuelles (à partir de Rust 1.33) de lever l'ambiguïté de cette expression:
fn main() {
println!("{:?}", "hello".chars().collect::<Vec<char>>());
}
ou:
fn main() {
let vec: Vec<char> = "hello".chars().collect();
println!("{:?}", vec);
}