変数に保存したり、引数として他の関数に渡すことができる匿名関数。無名関数やラムダ式に似ている。
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);
}
スマートな書き方ではありませんね。。
クロージャの値をうまく保持し続けたい時の書き方が知りたい。。