Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

変数をクロージャに渡す

説明

デフォルトでは、クロージャは借用によって環境をキャプチャします。あるいは、 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;
};
}

利点

コピーされたデータはクロージャ定義と一緒にまとめられるため、その目的がより明確になり、 クロージャによって消費されない場合でもすぐにドロップされます。

クロージャは、データがコピーされるかムーブされるかにかかわらず、周囲のコードと同じ変数名を使用します。

欠点

クロージャ本体のインデントが追加されます。