CodeBlanks Logo Icon CodeBlanks

Move semantiği

Değer taşımaları (move) ile sahipliğin nasıl devrettiğini öğrenirsin.

Move semantiği

String gibi heap'te veri tutan bir değer başka bir değişkene atanınca veri kopyalanmaz; sahiplik taşınır (move). Eski değişken geçersiz olur:

let a = String::from("kitap");
let b = a;               // sahiplik b'ye taşındı
// println!("{a}");      // hata E0382: taşınmış değer kullanıldı
println!("{b}");

Böylece iki değişken aynı belleği iki kez serbest bırakmaya çalışmaz (double free hatası imkânsız hâle gelir).

clone açıktır

Rust kopyalamayı gizlemez: pahalı bir derin kopya her zaman .clone() olarak kodda görünür.

let a = String::from("kitap");
let b = a.clone();      // yeni bellek ayrılır
println!("{a} {b}");    // ikisi de geçerli

Taşıma ucuzdur (yalnızca işaretçi, uzunluk ve kapasite kopyalanır); bu yüzden Rust varsayılan olarak taşımayı seçer. Çoğu durumda clone yerine referans (&a) kullanmak daha iyidir.

Uygulama Taşı ve kopyala

let a = String::from("kitap"); tanımla. let b = a.clone(); ile kopyala, let c = a; ile taşı. b ve c'yi tek satırda yazdır (artık a kullanılmamalı).

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn main() {
    let a = String::from("kitap");
    let b = a.clone();
    let c = a;
    println!("{} {}", b, c);
}

Beklenen çıktı

kitap kitap

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bir <code>String</code>'in gerçek bir kopyasını almak için ne kullanılır?

  • &a
  • copy(a)
  • .clone() Doğru cevap
  • let b = a;

Açıklama: clone heap verisinin derin kopyasını oluşturur; iki bağımsız String olur. Pahalı olabileceği için açıkça yazılır.

2 Derin kopya

Soru
let a = vec![1, 2, 3];
let b = a.____();
println!("{:?} {:?}", a, b);
Cevap
let a = vec![1, 2, 3];
let b = a.clone();
println!("{:?} {:?}", a, b);

Açıklama: clone heap verisini kopyalayıp bağımsız yeni bir değer oluşturur.

3 İşlem ve sonuç

Kavram Anlamı
let b = a; (String) Taşıma, a geçersiz
let b = a.clone(); Derin kopya, ikisi geçerli
E0382 Taşınmış değer kullanımı
Taşıma maliyeti Yalnızca 3 kelime

Başlangıç bölümündeki tüm dersler

16 Proje: Yapılacaklar listesi

  1. Görev modeli
  2. Ekleme
  3. Listeleme
  4. İşaretleme
  5. Komut okuma