この例では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」とは何か、またはその目的は何なのか理解できませんでした。
タイプサブスクリプションは、式に必要なタイプの注釈を付ける機能です。 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);
}