ProgramlamaBackend Geliştirici

Rust'ta değişkenlerin fonksiyonlara geçişinde move ve borrow kullanımı arasındaki fark nedir?

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

Cevap

Bir değişken bir fonksiyona geçerken, ya referansla (borrow, & veya &mut kullanarak) ya da taşınarak (move, referans olmadan) geçirilir.

Borrow: Verilere bir referans geçilir. Veriler, fonksiyon çağrısından sonra erişilebilir kalır, ancak değiştirilemez referans için içerik değiştirilemez, değiştirebilir referans için yalnızca 1 aktif referans olabilir.

fn read_length(s: &String) -> usize { s.len() }

Move: Değişken tamamen fonksiyona "taşınır". Gönderimden sonra orijinal değişkeni kullanamazsınız — taşındı ve herhangi bir erişim denemesi derleme hatasına yol açar.

fn destroy(s: String) { println!("{}", s); } // s, çıkışta yok edilecek. let s = String::from("world"); destroy(s); // s artık kullanılamaz.

Bu, çift bellek serbest bırakma ve diğer mülkiyet hatalarının oluşumunu engeller.

Dikkat Çekici Soru

Bir değişkeni, değer (move) olarak bir fonksiyona gönderdikten sonra kullanabilir miyim?

Hayır! Değeri olarak geçtikten sonra, örneğin, String — orijinal değişken geçersiz hale gelir:

let s = String::from("abc"); consume(s); // s burada artık geçerli değil. println!("{}", s); // derleme hatası.

Birçok kişi bunu Copy olan türlerin davranışıyla karıştırır (örneğin, i32), burada değişken gönderimden sonra geçerli kalır.

Konu hakkında bilgi eksikliğinden kaynaklanan gerçek hata örnekleri


Hikaye

Genç bir programcı, String alacak şekilde değil, &String alacak şekilde bir dize işleme fonksiyonu yazdı. Sonuç olarak, fonksiyon çağrısından sonra orijinal dize erişilemez hale geldi, bu da çift yükleme ve ek bellek tahsisine yol açtı.


Hikaye

Bir mikroserviste kritik bir kaynak, move ile farklı akışlara geçirildi; ardından bu kaynağa ana akışta erişme girişimleri derleme hatalarına yol açtı. Kaynağın referansla veya Arc gibi sarmallarla geçirilmesi için acil bir yeniden yapılandırma yapmak zorunda kaldık.


Hikaye

Dahili bir olay ayrıştırıcısında, veriler işlenirken değişken hızlı bir şekilde closure'a (move) alındı; ardından closure dışında ona erişim, derleme hatalarına neden oldu. Sorun sadece inceleme sırasında belirtildi - yerel işlevden daha uzun süre yaşamaları gereken veriler için borrow kullanımının zorunlu olduğu bir stil benimsendi.