【Rust】クロージャー

変数に保存したり、引数として他の関数に渡すことができる匿名関数。無名関数やラムダ式に似ている。

fn main(){
    let square = | x: i32 | {
        x * x
    };
    println!("{}", square(9));
}

moveでクロージャー外変数をクロージャー内に移動することができる。

fn main(){
    let msg = String::from("Hello");
    let func = move || {
        println!("{}", msg);
    };
    func();
}
#include <iostream>

auto func() {
    int x = 0;
    return [=]() mutable -> void {
        ++x;
        std::cout << x << std::endl;
    };
}

int main()
{
    auto f1 = func();
    f1();
    f1();
    f1();
    f1();

    auto f2 = func();
    f2();
    f2();
    f2();
    f2();
}
fn main(){
    let mut i = 0;
    let make_counter = | mut x:i32 | {
        i = x + 1;
        println!("{}", i);
    };

    make_counter(i);
    make_counter(i);
}

クロージャの中でグローバル変数は
3 | let make_counter = | mut x:i32 | {
| ————- `i` is borrowed here
4 | i = x + 1;
| – borrow occurs due to use of `i` in closure

fn main(){
    let mut i: i32 = 1;
    let make_counter = | mut x:i32 | {
        x = x + 1;
        println!("{}", x);
        return x;
    };

    i = make_counter(i);
    i = make_counter(i);
}

スマートな書き方ではありませんね。。
クロージャの値をうまく保持し続けたい時の書き方が知りたい。。