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 p1 hem de p2 kendi 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 bir String alanı ekleyin. String bir Copy türü olmadığı için derlenmeyecektir.
  • derive özniteliğinden Copy’yi kaldırın. Derleyici hatası şimdi p1 için println!’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.