Reklam · TEST
AdSense Test ReklamıGönderi üstü · Görüntülü

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:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1let v = vec![1, 2, 3];
2println!("{:?}", v); // v'nin sahibi ben
3println!("{:?}", v); // hala v'nin sahibi ben, sorun yok

Ama bunu bir fonksiyona geçersen:

1fn print_vec(v: Vec<i32>) { // v'nin sahipliği buraya transfer oldu
2println!("{:?}", v);
3} // v burada silinir
4
5let v = vec![1, 2, 3];
6print_vec(v); // sahiplik fonksiyona geçti
7println!("{:?}", v); // HATA! v'nin sahibi artık main değil

Derleyici 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ıyoruz
2println!("{:?}", v);
3} // v burada silinmez, sadece referans biter
4
5let v = vec![1, 2, 3];
6print_vec(&v); // &v'yi geçiyoruz
7println!("{:?}", v); // v hala bizim, sorun yok

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

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz