キャプチャ

クロージャは、定義された環境から変数をキャプチャできます。

// 著作権 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let max_value = 5;
    let clamp = |v| {
        if v > max_value { max_value } else { v }
    };

    dbg!(clamp(1));
    dbg!(clamp(3));
    dbg!(clamp(5));
    dbg!(clamp(7));
    dbg!(clamp(10));
}
  • デフォルトでは、クロージャは値を参照でキャプチャします。ここでは max_valueclamp によってキャプチャされていますが、表示のために main から引き続き利用できます。max_value を可変にして値を変更し、クランプされた値をもう一度表示してみてください。なぜこれはうまく動かないのでしょうか?

  • クロージャが値を変更する場合、それらを可変参照でキャプチャします。clampmax_value += 1 を追加してみてください。

  • move キーワードを使うと、参照する代わりに値をムーブするようクロージャに強制できます。これはライフタイムの扱いで役立つことがあります。たとえば、クロージャがキャプチャした値より長く生存しなければならない場合です(ライフタイムについては後で詳しく扱います)。

    これは move |v| .. のように書きます。このキーワードを追加して、clamp を定義した後でも mainmax_value に引き続きアクセスできるか確認してみてください。

  • デフォルトでは、クロージャは外側のスコープの各変数を、可能な限り最も制約の少ないアクセス方法でキャプチャします(可能なら共有参照、次に排他的参照、最後にムーブ)。move キーワードは値によるキャプチャを強制します。