Ana içeriğe geç
Modül 3 · Ders 1 ders 2Kurstaki 5/14~15 min
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:

  1. Rust'ta her değerin sahibi adı verilen bir değişkeni vardır.
  2. Aynı anda yalnızca bir sahip olabilir.
  3. 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:

Rust
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:

Rust
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:

Rust
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

Egzersiz#rust.m3.l1.e1
Denemeler: 0Yükleniyor…

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

Düzenleyici yükleniyor…
İ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

Egzersiz#rust.m3.l1.e2
Denemeler: 0Yükleniyor…

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.

Düzenleyici yükleniyor…
İ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

Egzersiz#rust.m3.l1.e3
Denemeler: 0Yükleniyor…

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.

Düzenleyici yükleniyor…
İ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