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