Modül dersleri (1/2)
Mülkiyet Kuralları
Sahiplik Rust'un en benzersiz özelliğidir. Dilin, bir Çöp Toplayıcıya ihtiyaç duymadan veya sizi yığın belleğini manuel olarak serbest bırakmaya zorlamadan (C veya C++'da olduğu gibi) bellek güvenliğini garanti etmesine olanak tanır.
Mülkiyetin Üç Kuralı
Rust'ta bellek yönetimi, derleyici tarafından sıkı bir şekilde kontrol edilen üç basit kurala tabidir:
- Rust'ta her değerin sahibi adı verilen bir değişkeni vardır.
- Aynı anda yalnızca bir sahip olabilir.
- Sahip kapsam dışına çıktığında değer otomatik olarak düşürülür.
Yığın ve Yığın
Sahipliği anlamak için verilerin nerede bulunduğunu bilmek önemlidir:
- Yığın: derleme zamanında bilinen sabit boyutlu verileri (ör. tamsayılar, boolean'lar) saklar. Erişim son derece hızlıdır.
- Yığın: derleme zamanında bilinmeyen dinamik boyutlu verileri depolar (örneğin,
String). Tahsis daha yavaştır ve Yığında saklanan bir işaretçi gerektirir.
"Hareket" Kavramı
Yığınla ayrılmış bir değişkeni diğerine atadığımızda, Rust değerin sahipliğini taşır (veya aktarır) ve ilk değişkeni geçersiz kılar:
let s1 = String::from("ciao");
let s2 = s1; // Ownership of the text moves to s2. s1 is NO longer usable!
// println!("{}", s1); // COMPILATION ERROR! s1 is "borrow of moved value"
println!("{}", s2); // Valid!Bu davranış, yalnızca s2 belleği boşaltacağından "çifte boş hata"yı (kapsam dışına çıkarken aynı belleği iki kez boşaltmaya çalışmak) önler.
"Klon" Kavramı (Derin Kopya)
Bir String içeriğini (hem yığın işaretçileri hem de yığındaki gerçek metin verileri) açıkça kopyalamamız gerekiyorsa, .clone() yöntemini kullanabiliriz. Bu, yeni bellek tahsisi için performans ek yükü pahasına hem orijinali hem de yeni değişkeni geçerli tutarak yığındaki verileri tamamen kopyalar:
let s1 = String::from("ciao");
let s2 = s1.clone(); // Deep copy. Both variables remain valid!
println!("s1: {}, s2: {}", s1, s2);"Kopyalama" Kavramı
Tamamen Yığın üzerinde depolanan basit türler için (tamsayılar i32, boolean'lar bool, karakterler char gibi), atama gerçek bir otomatik sığ kopya gerçekleştirir; bu, her iki değişkenin de geçerli kaldığı anlamına gelir:
let x = 5;
let y = x; // Copies the value 5 onto the stack. Both variables are usable!
println!("x: {}, y: {}", x, y); // Valid!Kendin dene
'Merhaba' metnini içeren bir String s1 bildirin. S1'i s2'ye atayın (sahipliği değiştirmek için). Son olarak println! kullanarak s2'yi yazdırın.
İpucu göster
Sahipliği `s2`ye aktarmak için `let s2 = s1;` kullanın ve bunu `println!('{}', s2);` ile yazdırın.
3 denemeden sonra çözüm mevcut
Değeri 5 olan bir x tamsayı değişkeni bildirin. X'i y'ye atayın (kopyalama gerçekleştirin). Son olarak, hem x'i hem de y'yi aynı println'de yazdırın! ifade.
İpucu göster
`let y = x;` yapın ve ardından her iki değeri de yazdırın, örneğin, `println!('{} {}', x, y);`.
3 denemeden sonra çözüm mevcut
Declare a String s1 with the value "Rust". Create a deep copy of s1 in a new variable s2 using the clone method. Finally, print both s1 and s2 separated by a space using the println! macro.
İpucu göster
Use `let s2 = s1.clone();` to deep copy the value of `s1` into `s2`, then print them with `println!("{} {}", s1, s2);`.
3 denemeden sonra çözüm mevcut