Yakalama (Capturing)

Bir çevreleyici (closure), tanımlandığı ortamdan değişkenleri yakalayabilir (capture).

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));
}
This slide should take about 5 minutes.
  • Varsayılan olarak, bir çevreleyici (closure) değerleri referans yoluyla yakalar. Burada max_value, clamp tarafından yakalanır, ancak yazdırma için main’de hala kullanılabilir. max_value değişkenini değiştirilebilir (mutable) yapmayı, değiştirmeyi ve değerleri tekrar yazdırmayı deneyin. Bu neden işe yaramıyor?

  • Bir çevreleyici (closure) değerleri değiştirirse, onları değiştirilebilir (mutable) referans yoluyla yakalar. clamp’e max_value += 1 eklemeyi deneyin.

  • Bir çevreleyiciyi (closure), move anahtar kelimesiyle değerleri referans almak yerine taşımaya (move) zorlayabilirsiniz. Bu, ömürlerle (lifetimes) ilgili yardımcı olabilir, örneğin çevreleyici yakalanan değerlerden daha uzun yaşamalıysa (ömürler hakkında daha sonra daha fazla bilgi).

    Bu, move |v| .. gibi görünüyor. Bu anahtar kelimeyi eklemeyi deneyin ve clamp’i tanımladıktan sonra main’in hala max_value’e erişip erişemediğini görün.

  • Varsayılan olarak, çevreleyiciler (closures) dış kapsamdan (outer scope) her değişkeni, yapabildikleri en az talepkar erişim biçimiyle yakalarlar (mümkünse paylaşılan (shared) referansla, sonra özel (exclusive) referansla, sonra taşıma (move) ile). move anahtar kelimesi, değerle yakalamayı (move)zorlar.