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)); }
-
Varsayılan olarak, bir çevreleyici (closure) değerleri referans yoluyla yakalar. Burada
max_value
,clamp
tarafından yakalanır, ancak yazdırma içinmain
’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
’emax_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 veclamp
’i tanımladıktan sonramain
’in halamax_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.