Paylaşılan 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;
    println!("r: {}", *r);
    r = &b;
    println!("r: {}", *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.

Rust, boşa düşen referansları (dangling references) statik olarak yasaklayacaktır:

fn x_axis(x: &i32) -> &(i32, i32) {
    let point = (*x, 0);
    return &point;
}
This slide should take about 10 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 uyarlanır/uygulanır (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.

  • Rust sizin için otomatik olarak referans oluşturmaz. & her zaman gereklidir.

  • 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 Rust'ta boşa çıkan referanslar (dangling reference) oluşamaz. x_axis fonksiyonu, point'e bir referans geri döndürecekti, ancak fonksiyon geri döndüğünde point için tahsis edilen alan geri verileceğinden (deallocation) bu kod derlenmeyecektir.

  • Sahipliğe (ownership) geçince ödünç alma (borrowing) konusunu daha detaylı konuşacağız.