Binding modları
- Rust kursu
- İleri seviye
- Ders 76/81
- 4 dk
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ılabilirKı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
fn main() {
// buraya yaz
}Örnek çözüm
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) => .., None => .. }</code> (<code>opt: Option<String></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
match ____ cift {
(s, n) => {
s.push('!');
*n += 1;
}
}
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 |