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; }
-
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
). Bununr
'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üğündepoint
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.