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)
.
- Metotlar bir türün (bir yapı veya enum gibi) bir örneği üzerinden çağrılır; ilk parametre, örneği (instance)
- 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
’inself
’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.
- Bunun