ProgramlamaRust geliştirici

Rust'taki closures (kapamalar) nasıl çalışır? Hangi tür kapamalar vardır, farkları nelerdir ve ne zaman kullanılırlar?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  • Fn: referansları yakalar (&T), çevreyi değiştirmeden birden fazla kez çağrılabilir.
  • FnMut: değiştirilebilir referansları yakalar (&mut T), çağrıldığında kapama verilerini değiştirmeye imkân tanır.
  • FnOnce: yalnızca bir kez çağrılabilir, çünkü yakalanan verilerin mülkiyetini alı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

Kandırmaca soru

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.

Konunun inceliklerinden dolayı gerçek hata örnekleri


Hikaye

Yeni başlayan bir Rust geliştiricisi, bir veri akışı projesinde move olmadan 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.