CodeBlanks Logo Icon CodeBlanks

self parametresi

&self ile metotları çağırmayı ve alanlara erişmeyi öğrenirsin.

self parametresi

self üç biçimde alınabilir ve her biri farklı bir sözleşmedir:

  • &self — okur; en yaygını.
  • &mut self — değiştirir.
  • self — örneği tüketir; çağrıdan sonra örnek kullanılamaz.
impl Kutu {
    fn kapsar(&self, d: &Kutu) -> bool {
        self.en > d.en && self.boy > d.boy
    }
    fn ozet(self) -> String {
        format!("{}x{}", self.en, self.boy)
    }
}

Ek parametreler

self'ten sonra normal parametreler gelir. Başka bir örneği okumak için o da referansla alınır:

let buyuk = Kutu { en: 8, boy: 6 };
let kucuk = Kutu { en: 3, boy: 4 };
println!("{}", buyuk.kapsar(&kucuk));   // true
println!("{}", kucuk.kapsar(&buyuk));   // false

Metot adları alan adlarıyla aynı olabilir: k.en alanı, k.en() ise metodu çağırır. Bu, getter yazmanın yaygın yoludur.

Uygulama Kapsama kontrolü

impl Kutu içinde fn kapsar(&self, d: &Kutu) -> bool yaz: hem eni hem boyu büyükse true. a = Kutu { en: 8, boy: 6 }, b = Kutu { en: 3, boy: 4 } için a.kapsar(&b) ve b.kapsar(&a) sonuçlarını yazdır.

Başlangıç kodu

main.rs
struct Kutu {
    en: u32,
    boy: u32,
}

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
struct Kutu {
    en: u32,
    boy: u32,
}

impl Kutu {
    fn kapsar(&self, d: &Kutu) -> bool {
        self.en > d.en && self.boy > d.boy
    }
}

fn main() {
    let a = Kutu { en: 8, boy: 6 };
    let b = Kutu { en: 3, boy: 4 };
    println!("{} {}", a.kapsar(&b), b.kapsar(&a));
}

Beklenen çıktı

true false

Soru ve cevaplar

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

1 <code>let s = k.ozet();</code> sonrasında <code>k.alan()</code> çağrılabilir mi? (<code>fn ozet(self)</code>, Kutu Copy değil)

  • Evet
  • Yalnızca k mut ise
  • ozet derlenmez
  • Hayır: k ozet içine taşındı Doğru cevap

Açıklama: self alan metot sahipliği alır. Dönüştürme metotları (into_*, ozet) çoğunlukla böyledir.

2 Okuyan metot

Soru
fn kapsar(____, d: &Kutu) -> bool {
    self.en > d.en && self.boy > d.boy
}
Cevap
fn kapsar(&self, d: &Kutu) -> bool {
    self.en > d.en && self.boy > d.boy
}

Açıklama: Yalnızca okuyan metot &self alır; örnek çağrıdan sonra da kullanılabilir.

3 İmza ve etkisi

Kavram Anlamı
fn f(&self) Okur
fn f(&mut self) Değiştirir
fn f(self) Tüketir
fn f() İlişkili fonksiyon

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