Rust'ta borrowing (ödünç alma), bir değişkenin referanslar aracılığıyla geçici olarak "ödünç alınması" mekanizmasıdır. Rust, değiştirilemez borç alma (&T) ve değiştirilebilir borç alma (&mut T) olarak iki tür ödünç alma türü ayırt eder. Aynı anda istediğiniz kadar değiştirilemez referans olabilir, ancak sadece bir adet değiştirilebilir referans olabilir. Aynı nesneye hem değiştirilebilir hem de değiştirilemez referansların eşzamanlı varlığına izin verilmez.
Bu kural, derleme aşamasında data race olmamasını garanti eder ve Rust'u rekabetçi programlama için güvenli hale getirir.
Örnek:
let mut value = 5; let r1 = &value; let r2 = &value; // let r3 = &mut value; // HATA: & varsa &mut oluşturulamaz println!("{} {}", r1, r2); // r3, r1/r2'nin yaşam alanı bitene kadar yasaktır
Soru: Aynı yaşam alanında bir &mut referansı ve istediğiniz kadar & referansı bir nesneye oluşturabilir misiniz?
Tipik yanlış cevap: Evet, ama sadece yaşam süreleri örtüşmüyorsa.
Doğru cevap: Aynı anda bir nesneye değiştirilebilir ve değiştirilemez referans olamaz (statik olarak birbirleriyle örtüşmeseler bile), bir tanesi yaşayacak olursa, diğerleri yasaktır. Güvenlik, borrow checker tarafından kontrol edilir.
Örnek:
let mut x = 10; let y = &x; let z = &mut x; // Hata, y hala yaşam alanında println!("{}", y); // y'ye daha sonra ihtiyaç var
Hikaye
Büyük bir proje kapsamında paralel veri işleme ile çalışan bir geliştirici, bir vektör üzerinde değiştirilemez referanslar kullanmaya karar verdi ve ardından sıralama için bir değiştirilebilir referans almayı denedi. Kod testte çalıştı, ancak yeniden düzenleme sonrasında derlenmez hale geldi çünkü değiştirilemez referansların yaşam süresi uzadı.
Hikaye
İç hizmette &mut kullanarak yapı üzerinde değişiklik yapıldı, bu sırada alanlara referanslar saklandı ve başka bir akışa gönderilmek istendi. Borrow kurallarının ihlali nedeniyle veri yarışı ve çökme meydana geldi — Rust, bunu yalnızca derleme aşamasında korur, ancak hatalar garantilerin kaldırıldığı unsafe bloklarda vardı.
Hikaye
API'nin hatalı belgelenmesi: Kütüphane, yapıdaki farklı alanlar için aynı anda & ve &mut kabul ediyordu, ancak aliasing nedeniyle invariance ihlal edildi ve bu kütüphaneyi entegre eden hizmetlerde zorlayıcı hatalar meydana geldi.