それはクロージャに捕捉した変数の所有権を移すための構文です。
クロージャは関数の外にある変数を捕捉しますが、デフォルトでは捕捉するときに参照で捕捉します。これを所有権ごと捕捉するようにするのが move || {}
構文です。ドキュメントだとクロージャの章で触れられています。
クロージャ:環境をキャプチャできる匿名関数 - The Rust Programming Language 日本語版
ドキュメントでの説明が簡素すぎるので以下に補足します。
move
をつける/つけないで挙動が変わるコード例が以下になります。変数を捕捉して書き換えるクロージャを書いて呼び出したあとに、捕捉された変数が書き換えの影響を受けるか受けないかが変わります。
rust
1// moveしないクロージャ
2let mut num = 0;
3let mut ref_cls = || {
4 num += 1;
5 num
6};
7assert_eq!(ref_cls(), 1);
8// numはクロージャと共有されてるので変更される
9assert_eq!(num, 1);
rust
1// moveするクロージャ
2let mut num = 0;
3// 本当は所有権がムーブするが、数値はCopyな型なのでコピーされる
4let mut ref_cls = move || {
5 num += 1;
6 num
7};
8assert_eq!(ref_cls(), 1);
9// numはクロージャとは無関係になったので影響を受けない
10assert_eq!(num, 0);
他にも、もちろん借用と所有権の移動の違いがあるので捕捉された変数をクロージャを作ったあとに使えるかも変わります。
rust
1// moveしないクロージャ
2let s = "String".to_string();
3let ref_cls = || {
4 println!("{}", s);
5};
6// 借用してるので使える
7println!("{}", s);
rust
1// moveするクロージャ
2let s = "String".to_string();
3let ref_cls = move || {
4 println!("{}", s);
5};
6// `s`は既にムーブしているので使うとエラー
7// println!("{}", s);
質問のコードは move
を外すと動かなくなると思います。 num
を借用していると関数の終わりでライフタイムが尽きるので関数の外に持ち出せなくなるからです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/11 03:51