CodeBlanks Logo Icon CodeBlanks

Fonksiyonlar ve sahiplik

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çerli

Fonksiyon 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

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

Örnek çözüm

main.rs
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) -&gt; 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

Soru
fn uzunluk(s: ____) -> usize {
    s.len()
}
Cevap
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

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