Referans ve fonksiyonlar
- Rust kursu
- Başlangıç
- Ders 52/115
- 4 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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
for x in v.____() {
*x += 1;
}
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 |