キャプチャ
クロージャは、定義された環境から変数をキャプチャできます。
// 著作権 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_valueはclampによってキャプチャされていますが、表示のためにmainから引き続き利用できます。max_valueを可変にして値を変更し、クランプされた値をもう一度表示してみてください。なぜこれはうまく動かないのでしょうか? -
クロージャが値を変更する場合、それらを可変参照でキャプチャします。
clampにmax_value += 1を追加してみてください。 -
moveキーワードを使うと、参照する代わりに値をムーブするようクロージャに強制できます。これはライフタイムの扱いで役立つことがあります。たとえば、クロージャがキャプチャした値より長く生存しなければならない場合です(ライフタイムについては後で詳しく扱います)。これは
move |v| ..のように書きます。このキーワードを追加して、clampを定義した後でもmainがmax_valueに引き続きアクセスできるか確認してみてください。 -
デフォルトでは、クロージャは外側のスコープの各変数を、可能な限り最も制約の少ないアクセス方法でキャプチャします(可能なら共有参照、次に排他的参照、最後にムーブ)。
moveキーワードは値によるキャプチャを強制します。