web-dev-qa-db-ja.com

型の表記とは何ですか?

この例では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);
  |         ^^^^^^^^^

この問題はletを使用することで解決されることは知っていますが、「型の表記」とは何で、その用途は何ですか。

issue#23416 および type ascriptionの機能ゲート が見つかりましたが、「type ascription」とは何か、またはその目的は何なのか理解できませんでした。

26
Angel Angel

タイプサブスクリプションは、式に必要なタイプの注釈を付ける機能です。 Rustは RFC 8 で説明されています)にタイプサブスクリプションを入力します。

状況によっては、式のタイプがあいまいになる場合があります。たとえば、次のコード:

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 メソッドは、イテレータのFromIteratorタイプの Item 特性を実装する任意のタイプを返すことができるためです。タイプサブスクリプションを使用すると、次のように記述できます。

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