CodeBlanks Logo Icon CodeBlanks

Binding modları

ref ve ref mut ile bağlama modlarını öğrenirsin.

Binding modları

Bir kalıp değeri üç biçimde bağlayabilir: taşıyarak (varsayılan), ref ile ödünç, ref mut ile değiştirilebilir ödünç. Bugün çoğu zaman bunları yazmak gerekmez: referans üzerinde eşleştirince (match &x, match &mut x) derleyici bağlama modunu kendisi seçer:

let mut cift = (String::from("a"), 1);
match &mut cift {
    (s, n) => {          // s: &mut String, n: &mut i32
        s.push('!');
        *n += 1;
    }
}
println!("{:?}", cift);   // ("a!", 2)

ref ne zaman gerekir?

Değerin kendisiyle eşleştirirken bir parçasını ödünç, diğerini taşıyarak almak istiyorsan ref hâlâ işe yarar:

let kayit = (String::from("ece"), vec![1, 2]);
let (ref ad, puanlar) = kayit;   // ad ödünç, puanlar taşındı
println!("{ad} {:?}", puanlar);
// kayit.1 artık kullanılamaz; kayit.0 kullanılabilir

Kısmi taşıma ve kısmi ödünç bir arada; bu ince ayar, büyük yapıları gereksiz kopyalamadan parçalamayı sağlar.

Uygulama Yerinde değiştir

let mut cift = (String::from("a"), 1); tanımla. match &mut cift ile metne '!' ekle ve sayıyı 1 artır; ardından cift'i {:?} ile yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn main() {
    let mut cift = (String::from("a"), 1);
    match &mut cift {
        (s, n) => {
            s.push('!');
            *n += 1;
        }
    }
    println!("{:?}", cift);
}

Beklenen çıktı

("a!", 2)

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>match opt { Some(s) =&gt; .., None =&gt; .. }</code> (<code>opt: Option&lt;String&gt;</code>) sonrasında <code>opt</code> kullanılabilir mi?

  • Evet
  • Yalnızca None ise
  • Derlenmez
  • Hayır; String s'ye taşındı. &opt ile eşleştirmek gerekir Doğru cevap

Açıklama: match &opt yazınca s bir &String olur ve opt sahipliğini korur; Some(ref s) eski yazımdır.

2 Değiştirilebilir eşleme

Soru
match ____ cift {
    (s, n) => {
        s.push('!');
        *n += 1;
    }
}
Cevap
match &mut cift {
    (s, n) => {
        s.push('!');
        *n += 1;
    }
}

Açıklama: &mut üzerinde eşleştirince bağlananlar &mut olur.

3 Eşleme ve bağlama türü

Kavram Anlamı
match x { (s, _) } Taşıma
match &x { (s, _) } &String
match &mut x { (s, _) } &mut String
let (ref a, b) = x; a ödünç, b taşınır

İleri seviye bölümündeki tüm dersler