web-dev-qa-db-fra.com

Qu'est-ce que l'attribution de type?

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.

26
Angel Angel

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);
}
32
Francis Gagné