クロージャ

Rustのクロージャ(ラムダ式やラムダとも呼ばれる)は環境をキャプチャできる関数です。 例えば、このクロージャはxをキャプチャします。

|val| val + x

クロージャの構文と機能はその場での使用に便利です。関数を呼ぶようにクロージャ を呼び出すことができます。しかし、入力値と返り値の型は推論できますが、入力の変数名は 指定する必要があります。

クロージャの他の特徴としては

  • 入力変数名を()ではなく||で囲む。
  • 式が一つのときは{}で囲む必要はありません(他は必須です)。
  • 外部の変数をキャプチャできます。.
fn main() {
    // 関数とクロージャでのインクリメント
    fn  function            (i: i32) -> i32 { i + 1 }

    // クロージャは名無しなので、参照に束縛します。
    // 注釈は関数の注釈と同じですが、本体を`{}`で囲む必要は
    // ありません。名無しのクロージャはは呼び出すために
    // 変数に代入する必要があります。
    let closure_annotated = |i: i32| -> i32 { i + 1 };
    let closure_inferred  = |i     |          i + 1  ;

    let i = 1;
    // 関数とクロージャを呼び出す。
    println!("function: {}", function(i));
    println!("closure_annotated: {}", closure_annotated(i));
    println!("closure_inferred: {}", closure_inferred(i));

    // 引数をとらず、`i32`を返すクロージャ。
    // 返り値は推論されます。
    let one = || 1;
    println!("closure returning one: {}", one());

}