Özet - Sahiplik
- Rust kursu
- Başlangıç
- Ders 47/115
- 5 dk
Move, Copy ve fonksiyon geçişlerini birleştirerek sahiplik akışını izlersin.
Sahiplik özeti
Üç kural: her değerin tek sahibi vardır; sahip kapsamdan çıkınca değer drop edilir; atama ve fonksiyon çağrısı Copy olmayan değerleri taşır. Copy türler (sayılar, bool, char, Copy alanlı tuple/dizi) kopyalanır. Derin kopya .clone() ile açıkça yapılır. Döndürmek sahipliği çağırana aktarır. Çöp toplayıcı olmadan bellek güvenliğini bu kurallar sağlar.
Kapsamlarla düşünmek
Bir değerin ne zaman bırakılacağını anlamak için süslü parantezlere bak: değer, sahibinin tanımlandığı bloğun sonunda bırakılır. Değeri daha erken bırakmak için drop(deger) çağrılabilir; bu özellikle kilitleri ve büyük tamponları erken serbest bırakmak için kullanışlıdır.
let buyuk = vec![0u8; 10_000_000];
// ... kullan ...
drop(buyuk); // bellek burada serbest
// buyuk artık kullanılamazUygulama Sahiplik zinciri
fn yeni_veri() -> String "veri" döndürsün; fn tuket(s: String) -> usize uzunluğu döndürsün. main'de let s = yeni_veri();, let kopya = s.clone();, let n = tuket(s); yap ve kopya ile n'yi yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn yeni_veri() -> String {
String::from("veri")
}
fn tuket(s: String) -> usize {
s.len()
}
fn main() {
let s = yeni_veri();
let kopya = s.clone();
let n = tuket(s);
println!("{} {}", kopya, n);
}Beklenen çıktı
veri 4
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Aşağıdakilerden hangisi derlenir?
- let v = vec![1]; let w = v; v.len();
- Hiçbiri
- let a = 5; let b = a; println!("{a}"); Doğru cevap
- let a = String::new(); let b = a; println!("{a}");
Açıklama: i32 Copy olduğu için a geçerli kalır; String ve Vec taşındığı için diğer ikisi E0382 verir.
2 Erken bırak
let tampon = vec![0u8; 1024];
____(tampon);
let tampon = vec![0u8; 1024];
drop(tampon);
Açıklama: drop değeri hemen bırakır; değişken sonra kullanılamaz.
3 Grubun özeti
| Kavram | Anlamı |
|---|---|
Sahip |
Tek |
Taşıma |
Copy olmayan türler |
Kopya |
Copy türler |
clone |
Açık derin kopya |