CodeBlanks Logo Icon CodeBlanks

Referans ve fonksiyonlar

Fonksiyonlara referans geçirmeyi ve geri almayı öğrenirsin.

Referans ve fonksiyonlar

Fonksiyon imzası, değerle ne yapılacağını açıkça söyler:

  • fn f(v: Vec<i32>) — sahipliği alır (tüketir).
  • fn f(v: &Vec<i32>) ya da &[i32] — yalnızca okur.
  • fn f(v: &mut Vec<i32>) — yerinde değiştirir.
fn toplam(v: &[i32]) -> i32 { v.iter().sum() }
fn ikiye_katla(v: &mut Vec<i32>) {
    for x in v.iter_mut() { *x *= 2; }
}

iter ve iter_mut

iter() elemanlara &T, iter_mut() ise &mut T verir. Elemanları yerinde değiştirmek için ikincisi kullanılır ve her eleman * ile çözülür:

let mut fiyatlar = vec![10.0, 20.0];
for f in fiyatlar.iter_mut() {
    *f *= 1.2;
}
println!("{:?}", fiyatlar);   // [12.0, 24.0]

for x in &mut v yazımı v.iter_mut() ile aynıdır.

Uygulama Oku ve değiştir

fn toplam(v: &[i32]) -> i32 ve fn ikiye_katla(v: &mut Vec<i32>) fonksiyonlarını yaz. let mut v = vec![1, 2, 3]; için önce ikiye_katla(&mut v), sonra toplam(&v) çağır ve v ile toplamı yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn toplam(v: &[i32]) -> i32 {
    v.iter().sum()
}

fn ikiye_katla(v: &mut Vec<i32>) {
    for x in v.iter_mut() {
        *x *= 2;
    }
}

fn main() {
    let mut v = vec![1, 2, 3];
    ikiye_katla(&mut v);
    let t = toplam(&v);
    println!("{:?} {}", v, t);
}

Beklenen çıktı

[2, 4, 6] 12

Soru ve cevaplar

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

1 Bir vektörü yalnızca okuyacak fonksiyon için en esnek parametre hangisidir?

  • &mut Vec<i32>
  • &Vec<i32>
  • &[i32] Doğru cevap
  • Vec<i32>

Açıklama: Dilim referansı hem &Vec<i32> hem dizi hem de alt dilim kabul eder; &Vec ise yalnızca vektör kabul eder.

2 Yerinde değiştir

Soru
for x in v.____() {
    *x += 1;
}
Cevap
for x in v.iter_mut() {
    *x += 1;
}

Açıklama: iter_mut elemanlara değiştirilebilir referans verir.

3 İmza ve niyet

Kavram Anlamı
v: Vec<T> Tüketir
v: &[T] Okur
v: &mut Vec<T> Değiştirir
v.iter_mut() &mut T elemanlar

Başlangıç bölümündeki tüm dersler

16 Proje: Yapılacaklar listesi

  1. Görev modeli
  2. Ekleme
  3. Listeleme
  4. İşaretleme
  5. Komut okuma