CodeBlanks Logo Icon CodeBlanks

Alan güncelleme

.. sözdizimiyle bir struct'tan diğerine alan aktarırsın.

Alan güncelleme sözdizimi

Var olan bir örneğin çoğu alanını kopyalayıp yalnızca bazılarını değiştirmek için ..kaynak kullanılır; her zaman en sonda yazılır:

let a = Oyuncu { ad: String::from("Ece"), puan: 10, aktif: true };
let b = Oyuncu { ad: String::from("Can"), ..a };
println!("{} {}", b.ad, b.puan);   // Can 10

Burada puan ve aktif Copy türleri olduğu için kopyalanır; a hâlâ tamamen kullanılabilir.

Kısmi taşıma

Bir struct'ın yalnızca bazı alanları taşınabilir; buna kısmi taşıma denir. Taşınan alana ve örneğin tamamına erişim yasaklanır, kalan alanlar kullanılabilir:

let a = Oyuncu { ad: String::from("Ece"), puan: 10, aktif: true };
let b = Oyuncu { puan: 99, ..a };
println!("{}", a.puan);    // olur: Copy
// println!("{}", a.ad);   // hata E0382
// let c = a;              // hata: a kısmen taşındı

Taşımayı önlemek için ..a.clone() yazabilirsin (struct Clone türetmeli).

Uygulama Yeni oyuncu türet

Oyuncu { ad: String, puan: u32, aktif: bool } tanımla. a = Ece, 10, true olsun. b'yi ad: "Can" ve ..a ile oluştur. b.ad, b.puan, b.aktif ve a.ad değerlerini boşlukla ayırarak yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
struct Oyuncu {
    ad: String,
    puan: u32,
    aktif: bool,
}

fn main() {
    let a = Oyuncu {
        ad: String::from("Ece"),
        puan: 10,
        aktif: true,
    };
    let b = Oyuncu {
        ad: String::from("Can"),
        ..a
    };
    println!("{} {} {} {}", b.ad, b.puan, b.aktif, a.ad);
}

Beklenen çıktı

Can 10 true Ece

Soru ve cevaplar

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

1 <code>let b = Oyuncu { puan: 99, ..a };</code> sonrasında <code>a.ad</code> kullanılabilir mi?

  • Evet, kopyalandı
  • Evet, ödünç alındı
  • b oluşturulamaz
  • Hayır: ad (String) b'ye taşındı Doğru cevap

Açıklama: ..a, verilmeyen alanları taşır. String Copy olmadığı için a.ad artık geçersizdir (a.puan ve a.aktif ise kullanılabilir).

2 Kalanı kopyala

Soru
let b = Oyuncu {
    ad: String::from("Can"),
    ____
};
Cevap
let b = Oyuncu {
    ad: String::from("Can"),
    ..a
};

Açıklama: ..a verilmeyen tüm alanları a'dan alır ve en sonda yazılır.

3 Durum ve sonuç

Kavram Anlamı
{ ad: yeni, ..a } sonra a.ad Kullanılabilir
{ puan: 1, ..a } sonra a.ad E0382
{ puan: 1, ..a } sonra a.puan Kullanılabilir (Copy)
..a.clone() Taşıma olmaz

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