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.
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.
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.