Alan güncelleme
- Rust kursu
- Başlangıç
- Ders 69/115
- 4 dk
.. 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 10Burada 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
fn main() {
// buraya yaz
}Örnek çözüm
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
let b = Oyuncu {
ad: String::from("Can"),
____
};
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 |