Metotlar

Rust, fonksiyonları yeni türlerinizle ilişkilendirmenize (associate) olanak tanır. Bunu bir impl bloğu ile yaparsınız:

#[derive(Debug)]
struct CarRace {
    name: String,
    laps: Vec<i32>,
}

impl CarRace {
    // Alıcı (receiver) yok, statik bir metot
    fn new(name: &str) -> Self {
        Self { name: String::from(name), laps: Vec::new() }
    }

    // self'e özel (exclusive) ödünç alınmış (borrowed) okuma-yazma erişimi
    fn add_lap(&mut self, lap: i32) {
        self.laps.push(lap);
    }

    // self'e paylaşılan ve salt okunur (read-only) ödünç alınmış (borrowed) erişim
    fn print_laps(&self) {
        println!("{} tur kaydedildi, {} için:", self.laps.len(), self.name);
        for (idx, lap) in self.laps.iter().enumerate() {
            println!("Tur {idx}: {lap} sn");
        }
    }

    // self'in özel (exclusive) sahipliği (daha sonra ele alınacak)
    fn finish(self) {
        let total: i32 = self.laps.iter().sum();
        println!("Yarış {} bitti, toplam tur süresi: {}", self.name, total);
    }
}

fn main() {
    let mut race = CarRace::new("Türkiye Grand Prix");
    race.add_lap(70);
    race.add_lap(68);
    race.print_laps();
    race.add_lap(71);
    race.print_laps();
    race.finish();
    // race.add_lap(42);
}

self argümanları “alıcıyı (receiver)” ( metodun üzerinde işlem yaptığı nesne) belirtir. Bir metot için birkaç yaygın alıcı vardır:

  • &self: nesneyi çağırandan paylaşılan ve değiştirilemez (shared and immutable) bir referans kullanarak ödünç alır (borrows). Nesne daha sonra tekrar kullanılabilir.
  • &mut self: nesneyi çağırandan benzersiz ve değiştirilebilir (unique and mutable) bir referans kullanarak ödünç alır (borrows). Nesne daha sonra tekrar kullanılabilir.
  • self: nesnenin sahipliğini (ownership) alır ve onu çağırandan uzağa taşır. Metot, nesnenin sahibi olur. Sahipliği açıkça (explicitly) aktarılmadığı sürece, metot geri döndüğünde nesne düşürülür (deallocated). Tam sahiplik otomatik olarak değiştirilebilirlik (mutability) anlamına gelmez.
  • mut self: yukarıdakiyle aynı, ancak metot nesneyi değiştirebilir.
  • Alıcı (receiver) yok: bu, yapı (struct) üzerinde statik bir metot haline gelir. Genellikle geleneksel olarak new olarak adlandırılan yapıcılar (constructors) oluşturmak için kullanılır.
This slide should take about 8 minutes.

Önemli Noktalar:

  • Metotları fonksiyonlarla karşılaştırarak tanıtmak faydalı olabilir.
    • Metotlar bir türün (bir yapı veya enum gibi) bir örneği üzerinden çağrılır; ilk parametre, örneği (instance) self olarak temsil (represents) eder.
    • Geliştiriciler, metot alıcı sözdiziminden (method receiver syntax) yararlanmak ve onları daha düzenli tutmaya yardımcı olmak için metotları kullanmayı seçebilirler. Metotları kullanarak tüm gerçekleştirim (implementation) kodunu tek bir öngörülebilir yerde tutabiliriz.
    • Metotların, alıcıyı (receiver) açıkça ileterek ilişkili fonksiyonlar gibi de çağrılabileceğini unutmayın, örn. CarRace::add_lap(&mut race, 20).
  • Bir metot alıcısı (receiver) olan self anahtar kelimesinin kullanımına dikkat çekin.
    • Bunun self: Self için kısaltılmış bir terim olduğunu gösterin ve belki de yapı (struct) adının nasıl kullanılabileceğini de gösterin.
    • Self’in, impl bloğunun içinde olduğu tür için bir tür takma adı (type alias) olduğunu ve bloğun başka yerlerinde de kullanılabileceğini açıklayın.
    • self’in diğer yapılar gibi nasıl kullanıldığına ve bireysel alanlara (individual fields) atıfta bulunmak için nokta (.) notasyonunun nasıl kullanılabileceğine dikkat edin.
    • finish’i iki kez çalıştırmayı deneyerek &self’in self’ten nasıl farklı olduğunu göstermek için bu iyi bir zaman olabilir.
    • self üzerindeki varyantların ötesinde, Box<Self> gibi alıcı (receiver) türleri olmasına izin verilen özel sarmalayıcı türleri de vardır.