Rust'ta iki temel referans türü vardır:
&T): yalnızca okuma erişimi sağlar.&mut T): referans aldıkları değeri değiştirmeye izin verir.Kurallar:
Söz dizimi örnekleri:
fn read(val: &i32) { println!("{}", val); } fn write(val: &mut i32) { *val += 1; } let mut x = 5; read(&x); write(&mut x);
Soru: Bir işlevin farklı görünüm alanlarında tek bir değişken üzerine iki değiştirilebilir referans oluşturabilir miyiz?
Cevap: Hayır, referanslar farklı bloklarda oluşturulsa bile, borcun analiz edilmesiyle ilgili görünüm alanı tüm işlevi kapsar veya derleyici, referansların kesişmediğini kesin olarak kanıtlayamazsa, değişkeni kapsar. Bu sık sık derleme hatalarına yol açar:
let mut x = 10; let r1 = &mut x; { let r2 = &mut x; // hata! }
Hikaye
Bir ayrıştırıcı geliştirirken, geliştirici okuma ve yazma optimizasyonu için aynı tampon üzerinde eşzamanlı olarak değiştirilebilir ve değiştirilemez bir referans saklamaya çalıştı. Sonuç olarak, kod derlenmedi ve "güvensiz" yöntemle kuralların "aşılması" sonucunda veri sızıntısı hataları ortaya çıktı.
Hikaye
Veri işleme projesinin başlangıcında, katılımcılardan biri iç içe görünen karmaşık kod için "reanalyze borrow checker" yapmadı. Sonuçta, kesişen referanslar yüzünden klasik "değiştirilebilir olarak ödünç alınamaz çünkü değiştirilemez olarak da ödünç alındı" hatası ortaya çıktı, kaynak kodunda sorunun yerini açıkça belirtmeden.
Hikaye
Çok iş parçacıklı kodda, paylaşılan verilere erişim için normal referanslar kullanıldı. Parallele iş parçacıklarında verileri değiştirme girişiminde bulunulduğunda, beklenmeyen derleme hataları ve gizli kod aracılığıyla borç kontrolünün aşılması sonucu veri yarışı sorunları oluştu.