Borrowing kuralları
- Rust kursu
- Başlangıç
- Ders 50/115
- 4 dk
Aynı anda birden fazla referans alma kurallarını öğrenirsin.
Borrowing kuralları
Herhangi bir anda bir değer için şunlardan yalnızca biri doğru olabilir:
- istediğin kadar
&T(okuyucu), ya da - tek bir
&mut T(yazıcı).
let mut v = vec![1, 2, 3];
let ilk = &v[0]; // okuyucu
// v.push(4); // hata E0502: okuyucu varken yazılamaz
println!("{ilk}");
v.push(4); // ilk artık kullanılmıyor, sorun yokBu kural, vektör büyürken yeni belleğe taşınıp eski adresi gösteren referansın geçersiz kalmasını önler.
Hatayı çözmek
Bu tür hataların çözümü genellikle şunlardan biridir: referansın kullanımını değişiklikten önce bitirmek, değeri kopyalamak (let ilk = v[0]; i32 için Copy) ya da işlemleri ayırmak:
let mut v = vec![1, 2, 3];
let ilk = v[0]; // kopya, referans değil
v.push(ilk * 10);
println!("{:?}", v); // [1, 2, 3, 10]Uygulama İlk elemanı çoğalt
let mut v = vec![1, 2, 3]; tanımla. İlk elemanı kopyalayarak al (let ilk = v[0];), ardından v.push(ilk * 10); yap ve {:?} ile yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn main() {
let mut v = vec![1, 2, 3];
let ilk = v[0];
v.push(ilk * 10);
println!("{:?}", v);
}Beklenen çıktı
[1, 2, 3, 10]
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Yukarıdaki örnekte <code>v.push(4)</code> neden ilk satırda hata verirdi?
- push yeni belleğe taşıyabilir ve ilk geçersiz bir adrese bakardı Doğru cevap
- v değiştirilemez
- 4 yanlış tür
- Hata vermezdi
Açıklama: Kapasite dolunca vektör yeni bir dizi ayırıp elemanları taşır; borrow checker bu "kullanımdan sonra serbest bırakma" hatasını derlemede yakalar.
2 Kopyayla çöz
let mut v = vec![5, 6];
let ilk = ____; // referans değil
v.push(ilk);
let mut v = vec![5, 6];
let ilk = v[0]; // referans değil
v.push(ilk);
Açıklama: v[0] i32 için bir kopya üretir; böylece v değiştirilebilir.
3 Durum ve sonuç
| Kavram | Anlamı |
|---|---|
&v + &v |
İzin verilir |
&mut v + &mut v |
E0499 |
&v + v.push() |
E0502 |
let x = v[0]; v.push() |
İzin verilir (kopya) |