İlişkili Fonksiyonlar
Coddy'nin Rust Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 4 / 61.
Bir impl bloğundaki tüm fonksiyonların mevcut bir örnek üzerinde işlem yapması gerekmez. Parametre olarak self almayan fonksiyonlara ilişkili fonksiyonlar denir; bunlar belirli bir örnekten ziyade türün kendisiyle ilişkilidir.
İlişkili fonksiyonların en yaygın kullanımı yapıcılar (constructors) oluşturmaktır. Geleneksel olarak, bunlar genellikle new olarak adlandırılır:
struct Player {
name: String,
score: u32,
}
impl Player {
fn new(name: String) -> Player {
Player {
name,
score: 0,
}
}
}
Burada self parametresi olmadığına dikkat edin—bu fonksiyonun çalışması için mevcut bir Player nesnesine ihtiyacı yoktur. Bunun yerine, yepyeni bir tane oluşturur ve döndürür. Dönüş türü yapının (struct) kendisidir.
İlişkili bir fonksiyonu çağırmak için, nokta notasyonu yerine tür adıyla birlikte :: söz dizimini kullanın:
fn main() {
let player1 = Player::new(String::from("Alice"));
println!("{} starts with {} points", player1.name, player1.score);
// Çıktı: Alice 0 puanla başlar
}
Bu desen, oluşturma mantığını tür tanımıyla birlikte tutarak, struct'ları varsayılan değerlerle veya doğrulama mantığıyla başlatmak için temiz bir yol sağlar. Bu söz dizimini muhtemelen String::from() ile zaten görmüşsünüzdür—bu da bir ilişkili fonksiyondur!
Görev
Kolayİki alanı olan bir Book struct'ı oluşturun: title (String) ve pages (u32).
Book için new adında bir ilişkili fonksiyon (associated function) içeren bir uygulama bloğu (implementation block) ekleyin:
- Bir
title: Stringparametresi alır - Verilen başlığa sahip ve
pagesdeğeri0olarak ayarlanmış yeni birBookdöndürür
Ayrıca &self alan ve şu formatta bir String döndüren info adında bir metot ekleyin: "{title} has {pages} pages"
Bir girdi alacaksınız:
- Kitabın başlığı (String)
Sağlanan başlıkla bir kitap oluşturmak için Book::new ilişkili fonksiyonunu kullanın, ardından info metodunu çağırmanın sonucunu yazdırın.
Beklenen çıktı formatı:
{title} has {pages} pagesKopya kağıdı
Bir impl bloğunda self parametresi almayan fonksiyonlara ilişkili fonksiyonlar (associated functions) denir. Bunlar, belirli bir örnekten ziyade türün kendisiyle ilişkilidirler.
İlişkili fonksiyonlar yaygın olarak yapıcılar (constructors) olarak kullanılır ve genellikle new olarak adlandırılırlar:
struct Player {
name: String,
score: u32,
}
impl Player {
fn new(name: String) -> Player {
Player {
name,
score: 0,
}
}
}
Bir ilişkili fonksiyonu çağırmak için tür adıyla birlikte :: söz dizimini kullanın:
let player1 = Player::new(String::from("Alice"));
String::from(), halihazırda kullandığınız bir ilişkili fonksiyon örneğidir.
Kendin dene
use std::io;
// TODO: Başlık (String) ve sayfa sayısı (u32) alanlarına sahip Book yapısını (struct) tanımlayın
// TODO: Book için aşağıdakileri içeren bir impl bloğu ekleyin:
// - Bir başlık alan ve sayfaları 0 olarak ayarlanmış bir Book döndüren `new` ilişkili fonksiyonu
// - "{title} has {pages} pages" formatında bir String döndüren `info` metodu
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let title = input.trim().to_string();
// TODO: Sağlanan başlıkla bir kitap oluşturmak için Book::new kullanın
// TODO: info metodunu çağırmanın sonucunu yazdırın
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1Metotlar ve Davranış
Uygulama Bloklarına GirişSelf ParametresiDeğiştirilebilir Metotlarİlişkili FonksiyonlarBirden Fazla Uygulama BloğuMetot ZincirlemeÖzet - Dikdörtgen Eylemleri4Proje: Sanal Evcil Hayvan
Evcil Hayvanı TanımlamaEvcil Hayvanı Besleme2Kapsülleme ve Modüller
Modül TemelleriPublic Anahtar KelimesiPrivate AlanlarGetter'larSetter'larÖzet - Güvenli Kasa5Generic Yapılar
Generic Struct'larGeneric MetotlarÇoklu Generic TürlerGeneric FonksiyonlarÖzet - Koordinat Noktası8Sınırlandırıcı Olarak Trait'ler
Trait Sınırlandırıcı SözdizimiÇoklu SınırlandırıcılarWhere CümleciğiTrait'ler ile Tip DöndürmeÖzet - Generic Yazıcı11Rust'ta Tasarım Kalıpları
Newtype KalıbıKompozisyonDrop Trait'iFrom ve IntoÖzet - Smart Pointer Mock3İleri Seviye Enum'lar
Veri İçeren Enum'larEnum MetotlarıVeri Varyantlarını EşlemeOption Enum'ına Yeniden BakışÖzet - Shape Enum6Trait Tanımlama
Trait Nedir?Traitleri UygulamaVarsayılan UygulamalarVarsayılanları Geçersiz KılmaParametreli TraitlerÖzet - Media Player