Rust'ta kapamalar, dış görünümlerden değişkenleri "yakalayabilen" anonim fonksiyonlardır. Söz dizimi:
let add = |a: i32, b: i32| a + b;
Rust'ta değişken yakalama yöntemine göre üç tür kapama vardır:
&T), çevreyi değiştirmeden birden fazla kez çağrılabilir.&mut T), çağrıldığında kapama verilerini değiştirmeye imkân tanır.T).Rust, gerekli türü otomatik olarak belirler, ancak bunu açıkça belirtebilirsiniz.
Farkların örneği:
let s = String::from("hello"); // FnOnce let consume = move || println!("{}", s); // çağrıldıktan sonra s artık erişilemez
move anahtar kelimesi ile kapama neden FnOnce olmayabilir, Fn veya FnMut olabilir?
Cevap: move anahtar kelimesi değişkenlerin mülkiyetini yakalar, ancak eğer kapama içindeki veriler değiştirilmez ve yok edilmezse, kapama Fn/FnMut ile uyumlu kalır. Örneğin:
let s = String::from("abc"); let c = move || println!("String: {}", s); // c: impl Fn() c();
c birden fazla kez çağrılabilir: değer s kapama içine kopyalandı, ancak yok edilmedi.
Hikaye
Yeni başlayan bir Rust geliştiricisi, bir veri akışı projesinde
moveolmadan bir kapama yazmaya çalıştı ve başka bir akışa geçirdi. Sonuç olarak, derleyici outlived borrow hatası verdi ve yaşam süresi ve move detayları konusunda acilen bilgi edinmek zorunda kaldı.
Hikaye
Değiştirilebilirliği kapama içine koydular, ancak türü FnMut'a değiştirmedikleri için iterator'ların kullanıldığı tüm yerlerde "mismatched types" hatası oluştu.
Hikaye
Büyük bir dizi işlenirken kapama tüm koleksiyonu move ile alıyordu, bu nedenle mülkiyetin kaymasını fark etmeden dış kod veriye ilk iterasyondan sonra erişimini kaybetti ve taşınan değerle işlem yapmaya çalıştılar.