Kopyalanan Türler
Taşıma (move) semantiği varsayılan olsa da, belirli türler varsayılan olarak kopyalanır:
fn main() { let x = 42; let y = x; dbg!(x); // would not be accessible if not Copy dbg!(y); }
Bu türler Copy özelliğini (trait) gerçekleştirir.
Kendi türlerinizi kopya semantiğini (copy semantics) kullanacak şekilde seçebilirsiniz:
#[derive(Copy, Clone, Debug)] struct Point(i32, i32); fn main() { let p1 = Point(3, 4); let p2 = p1; println!("p1: {p1:?}"); println!("p2: {p2:?}"); }
- Atamadan sonra hem
p1hem dep2kendi verilerine sahiptir. - Veriyi açıkça kopyalamak için
p1.clone()da kullanabiliriz.
This slide should take about 5 minutes.
Kopyalama (copying) ve klonlama (cloning) aynı şey değildir:
- Kopyalama, bellek bölgelerinin bitsel kopyalarına atıfta bulunur ve keyfi nesneler üzerinde çalışmaz.
- Kopyalama, özel mantığa izin vermez (C++’daki kopyalayan yapıcı özel üye fonksiyonlarının -copy constructors- aksine).
- Klonlama daha genel bir işlemdir ve ayrıca
Cloneözelliğini (trait) gerçekleştirerek özel davranışlara da olanak tanır. Dropözelliğini (trait) gerçekleştiren türlerde kopyalama çalışmaz.
Yukarıdaki örnekte, aşağıdakileri deneyin:
struct Point’e birStringalanı ekleyin.StringbirCopytürü olmadığı için derlenmeyecektir.deriveözniteliğindenCopy’yi kaldırın. Derleyici hatası şimdip1içinprintln!’dedir.- Bunun yerine
p1’i klonlarsanız çalıştığını gösterin.
Daha Fazlasını Keşfedin
- Paylaşılan (shared) referanslar
Copy/Clone’dur, değiştirilebilir (mutable) referanslar değildir. Bunun nedeni, Rust’ın değiştirilebilir referansların dışlayan (exclusive) olmasını gerektirmesidir, bu nedenle paylaşılan bir referansın kopyasını oluşturmak geçerli olsa da, değiştirilebilir bir referansın kopyasını oluşturmak Rust’ın ödünç alma (borrowing) kurallarını ihlal eder.