Rust'ta Ownership ve Borrowing: Derleyici ile Barışmak
Rust'a yeni başlayanların çoğu ilk haftasında bir Vec'i fonksiyona geçiyor, onu yazdırıyor, sonra main'de tekrar yazdırmaya çalışıyor ve derleyici 'value has been moved' diyerek tepki veriyor. Sonra rastgele yerlere & işareti ekliyorsun, bir an için kendini başarılı hissediyorsun ve ertesi gün aynı duvar sana struct'ta çarpıyor. bu noktada çoğu kişi Rust'ı bırakıyor, sözdizimi yüzünden değil, çünkü ownership keyfi kurallar gibi görünüyor.
Aslında öyle değil. Ownership'in tamamı üç basit kurala dayanıyor ve bunları kafana yerleştirdiğin anda her şey açığa çıkıyor. Her değerin bir sahibi vardır. Aynı anda sadece bir sahip olabilir. Sahip scope dışına çıktığında, değer silinir. Bu kadar. Move, borrow ve lifetime'lar bunların sonuçlarıdır.
Bunu anlamak için bir örnek yeterli. Diyelim bir Vec'in var:
1let v = vec![1, 2, 3];2println!("{:?}", v); // v'nin sahibi ben3println!("{:?}", v); // hala v'nin sahibi ben, sorun yokAma bunu bir fonksiyona geçersen:
1fn print_vec(v: Vec<i32>) { // v'nin sahipliği buraya transfer oldu2println!("{:?}", v);3} // v burada silinir45let v = vec![1, 2, 3];6print_vec(v); // sahiplik fonksiyona geçti7println!("{:?}", v); // HATA! v'nin sahibi artık main değilDerleyici seni engelliyor çünkü main'de v'yi kullanmaya çalışıyorsun ama o artık silinmiş. Çözüm? Referans kullan:
1fn print_vec(v: &Vec<i32>) { // sadece ödünç alıyoruz2println!("{:?}", v);3} // v burada silinmez, sadece referans biter45let v = vec![1, 2, 3];6print_vec(&v); // &v'yi geçiyoruz7println!("{:?}", v); // v hala bizim, sorun yokBorrow checker seni rahatsız etmek için değil, bellek güvenliğini garantilemek için var. Derleyici hatası aldığında, 'ne yanlış yaptım' yerine 'hangi kurala aykırı geldim' sor. Genellikle cevap ya 'sahipliği geçtim ama tekrar kullanmaya çalıştım' ya da 'mutable ve immutable referansı aynı anda kullandım' olur. Bu iki durumu kavradığında, Rust'ın çoğu hatası kendiliğinden çözülür.
0 yorum