Move semantiği
- Rust kursu
- Başlangıç
- Ders 43/115
- 4 dk
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çerliTaşı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
fn main() {
// buraya yaz
}Örnek çözüm
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
let a = vec![1, 2, 3];
let b = a.____();
println!("{:?} {:?}", a, b);
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 |