Copy özelliği
- Rust kursu
- Başlangıç
- Ders 44/115
- 4 dk
Copy özelliğine sahip türlerin kopyalanma davranışını öğrenirsin.
Copy özelliği
Tamamen yığında (stack) duran küçük türler Copy trait'ini uygular ve atamada kopyalanır, taşınmaz: tüm tam sayılar, ondalıklar, bool, char ve yalnızca Copy türlerden oluşan tuple ve diziler.
let x = 5;
let y = x; // kopya; x hâlâ geçerli
println!("{x} {y}");
let p = (1, 2.5);
let q = p; // tuple da Copy
println!("{:?}", p);String, Vec ve Box Copy değildir çünkü heap belleğine sahiptirler.
Kendi türüne Copy
Yalnızca Copy alanları olan kendi struct'ına #[derive(Clone, Copy)] ekleyebilirsin. Copy her zaman Clone ile birlikte istenir:
#[derive(Debug, Clone, Copy)]
struct Nokta {
x: i32,
y: i32,
}
let a = Nokta { x: 1, y: 2 };
let b = a; // kopyalanır
println!("{:?} {:?}", a, b);Uygulama Kopyalanan nokta
#[derive(Debug, Clone, Copy)] struct Nokta { x: i32, y: i32 } tanımla. let a = Nokta { x: 1, y: 2 };, let mut b = a;, b.x = 10; yap ve {:?} {:?} ile a ve b'yi yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
#[derive(Debug, Clone, Copy)]
struct Nokta {
x: i32,
y: i32,
}
fn main() {
let a = Nokta { x: 1, y: 2 };
let mut b = a;
b.x = 10;
println!("{:?} {:?}", a, b);
}Beklenen çıktı
Nokta { x: 1, y: 2 } Nokta { x: 10, y: 2 }
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Hangisi <code>Copy</code> değildir?
- char
- (i32, String) Doğru cevap
- (i32, f64)
- [u8; 4]
Açıklama: Bir tuple yalnızca tüm elemanları Copy ise Copy'dir; String içerdiği için bu tuple taşınır.
2 Kopyalanabilir tür
#[derive(Clone, ____)]
struct Renk(u8, u8, u8);
#[derive(Clone, Copy)]
struct Renk(u8, u8, u8);
Açıklama: Copy türetmek değerin atamada otomatik kopyalanmasını sağlar.
3 Tür ve davranış
| Kavram | Anlamı |
|---|---|
i32 |
Copy: yığında kopyalanır |
String |
Move: heap sahipliği taşınır |
(i32, String) |
Move: bir alan Copy değil |
#[derive(Clone, Copy)] |
Kendi türünü Copy yapar |