変数をクロージャに渡す
説明
デフォルトでは、クロージャは借用によって環境をキャプチャします。あるいは、
move クロージャを使用して環境全体をムーブすることもできます。しかし多くの場合、
一部の変数だけをクロージャにムーブしたり、一部のデータのコピーを渡したり、参照で渡したり、
その他の変換を行ったりしたいことがあります。
そのためには、別のスコープで変数の再束縛を使用します。
例
以下を使用します。
#![allow(unused)]
fn main() {
use std::rc::Rc;
let num1 = Rc::new(1);
let num2 = Rc::new(2);
let num3 = Rc::new(3);
let closure = {
// `num1` はムーブされる
let num2 = num2.clone(); // `num2` はクローンされる
let num3 = num3.as_ref(); // `num3` は借用される
move || {
*num1 + *num2 + *num3;
}
};
}
以下の代わりに使用します。
#![allow(unused)]
fn main() {
use std::rc::Rc;
let num1 = Rc::new(1);
let num2 = Rc::new(2);
let num3 = Rc::new(3);
let num2_cloned = num2.clone();
let num3_borrowed = num3.as_ref();
let closure = move || {
*num1 + *num2_cloned + *num3_borrowed;
};
}
利点
コピーされたデータはクロージャ定義と一緒にまとめられるため、その目的がより明確になり、 クロージャによって消費されない場合でもすぐにドロップされます。
クロージャは、データがコピーされるかムーブされるかにかかわらず、周囲のコードと同じ変数名を使用します。
欠点
クロージャ本体のインデントが追加されます。