Paylaşılan (Shared) Referanslar

Bir referans, değerin sahipliğini almadan başka bir değere erişmenin bir yolunu sağlar ve “ödünç alma (borrowing)” olarak da adlandırılır. Paylaşılan referanslar (shared reference) salt okunurdur (read-only) ve referans edilen veriler değiştirilemez.

fn main() {
    let a = 'A';
    let b = 'B';

    let mut r: &char = &a;
    dbg!(r);

    r = &b;
    dbg!(r);
}

T türüne yönelik paylaşılan referansın türü &T’dir. & operatörüyle bir referans değeri (reference value) oluşturulur. * operatörü bir referansın içeriğine eriştirir (dereference) ve onun değerini verir.

This slide should take about 7 minutes.
  • Rust’ta referanslar hiçbir zaman null olamaz, bu yüzden null kontrolü (null checking) gerekli değildir.

  • Bir referansın, atıfta bulunduğu (refer) değeri “ödünç aldığı (barrow)” söylenir ve bu, göstericilere aşina olmayan öğrenciler için iyi bir modeldir: kod, değere erişmek için referansı kullanabilir, ancak değer yine de orijinal değişken tarafından “sahiplidir (owned)”. Kurs, 3. günde sahiplik (ownership) konusunda daha ayrıntılı bilgi verecektir.

  • Referanslar göstericiler (pointers) olarak gerçekleştirilir (implement) ve önemli bir avantaj şudur ki, gösterdikleri şeyin boyutundan çok daha küçük olabilmeleridir. C veya C++’a aşina olan öğrenciler referansları göstericiler olarak tanıyacaklardır. Kursun ilerleyen bölümlerinde Rust’ın, ham göstericilerin (raw pointers) kullanılmasından kaynaklanan bellek emniyeti hatalarını (memory-safety bugs) nasıl önlediği ele alınacaktır.

  • Açık bir şekilde (explicit) & ile referans vermek genellikle gereklidir. Ancak, Rust metotları çağırırken referans verme ve referanstan çıkarma (dereferencing) işlemlerini otomatik olarak gerçekleştirir.

  • Rust bazı durumlarda, özellikle de metotları çağırırken (r.is_ascii()’i deneyin) otomatik olarak referansın içeriğine erişecektir (auto-dereference). C++’daki gibi -> operatörüne gerek yoktur.

  • Bu örnekte, r değiştirilebilir (mutable) olduğundan ona tekrar atama yapılabilir (reassigned) (r = &b). Bunun r’yi yeniden bağladığını (re-bind) ve böylece başka bir şeye atıfta bulunduğunu (refer) unutmayın. Bu C++ dilinden, bir referansa atamanın (assignment) referans verilenin değerini değiştirmesinden, farklıdır.

  • Paylaşılan bir referans (shared reference), atıfta bulunduğu (refer) değerin değiştirilmesine (modify), bu değer değiştirilebilir (mutable) olsa bile, izin vermez. *r = 'X'’i deneyin.

  • Rust, yeterince uzun süre hayatta olmalarını sağlamak için tüm referansların ömrülerini (lifetime) takip eder. Emniyetli (safe) Rust’ta boşa çıkan referanslar (dangling reference) oluşamaz.

  • Sahipliğe (ownership) geçince ödünç alma (borrowing) konusunu daha detaylı konuşacağız. Sahiplik (ownership) konusuna geldiğimizde ödünç alma ve boşa çıkan referansları (dangling references) daha detaylı konuşacağız.