Fonksiyonlar ve sahiplik
- Rust kursu
- Başlangıç
- Ders 45/115
- 4 dk
Fonksiyona değer geçirmenin sahiplik üzerindeki etkisini öğrenirsin.
Fonksiyonlar ve sahiplik
Bir değeri fonksiyona vermek de atama gibidir: Copy olmayan türler fonksiyona taşınır ve çağıran onları kaybeder:
fn yazdir(s: String) {
println!("{s}");
} // s burada drop edilir
let ad = String::from("Ada");
yazdir(ad);
// println!("{ad}"); // hata: ad taşındı
let n = 5;
kare(n); // i32 kopyalanır, n hâlâ geçerliFonksiyon değeri yalnızca okuyacaksa sahiplik yerine referans (&String ya da &str) almalıdır.
Ne zaman sahiplik alınır?
Fonksiyon değeri saklayacaksa (bir struct alanına koymak, bir vektöre eklemek) sahiplik alması doğaldır: fn ekle(&mut self, ad: String). Değeri dönüştürüp yeni değer döndürecekse de sahiplik almak gereksiz kopyayı önler: fn buyut(mut s: String) -> String. Aksi hâlde ödünç alma tercih edilir.
Uygulama Ödünç alan fonksiyon
fn uzunluk(s: &str) -> usize yaz. let ad = String::from("Ada Lovelace"); için uzunluk(&ad) çağır, ardından ad'ı hâlâ kullanabildiğini göstermek için println!("{} {}", ad, n); yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn uzunluk(s: &str) -> usize {
s.len()
}
fn main() {
let ad = String::from("Ada Lovelace");
let n = uzunluk(&ad);
println!("{} {}", ad, n);
}Beklenen çıktı
Ada Lovelace 12
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>fn uzunluk(s: String) -> usize</code> imzasının sorunu nedir?
- Yalnızca okumak için sahipliği alır; çağıran String'i kaybeder Doğru cevap
- usize yanlış tür
- String uzunluğu ölçülemez
- Sorun yoktur
Açıklama: fn uzunluk(s: &str) -> usize daha iyidir: ödünç alır, hem String hem &str kabul eder.
2 Ödünç parametre
fn uzunluk(s: ____) -> usize {
s.len()
}
fn uzunluk(s: &str) -> usize {
s.len()
}
Açıklama: &str parametresi metni sahipliğini almadan okur.
3 İmza ve anlamı
| Kavram | Anlamı |
|---|---|
fn f(s: String) |
Sahipliği alır |
fn f(s: &str) |
Ödünç alır |
fn f(n: i32) |
Kopya alır |
fn f(mut s: String) -> String |
Dönüştürüp geri verir |