Birden Fazla Uygulama Bloğu
Coddy'nin Rust Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 5 / 61.
Rust, bir struct'ın metotlarını birden fazla impl bloğuna ayırmanıza olanak tanır. Her şey tek bir blokta toplanabilse de, bunları ayırmak kodunuzu daha düzenli ve okunabilir hale getirebilir.
İşte işlevselliği iki uygulama (implementation) bloğuna bölünmüş bir struct:
struct BankAccount {
balance: f64,
}
// Yapıcı (Constructor) ve temel sorgular
impl BankAccount {
fn new(initial: f64) -> BankAccount {
BankAccount { balance: initial }
}
fn balance(&self) -> f64 {
self.balance
}
}
// İşlem metotları
impl BankAccount {
fn deposit(&mut self, amount: f64) {
self.balance += amount;
}
fn withdraw(&mut self, amount: f64) {
self.balance -= amount;
}
}
Her iki blok da sorunsuz bir şekilde birlikte çalışır; Rust bunları tek bir blokmuş gibi ele alır. Hangi blokta tanımlandığına bakılmaksızın herhangi bir metodu çağırabilirsiniz:
fn main() {
let mut account = BankAccount::new(100.0);
account.deposit(50.0);
println!("{}", account.balance()); // 150
}
Bu desen, struct'larınız büyüdükçe özellikle kullanışlı hale gelir. Yapıcıları bir araya getirebilir, salt okunur metotları değiştirenlerden ayrı tutabilir veya özelliğe göre düzenleyebilirsiniz. Bir struct'ın kaç tane impl bloğuna sahip olabileceği konusunda bir sınır yoktur.
Görev
Kolayİki alana sahip bir Player struct'ı oluşturun: name (String) ve score (u32).
Struct'ın metotlarını iki ayrı uygulama bloğu (implementation block) halinde düzenleyin:
Birinci impl bloğu — Yapıcı (Constructor) ve sorgu:
new— birname: Stringalan vescoredeğeri0olarak ayarlanmış birPlayerdöndüren ilişkili bir fonksiyonget_score—&selfalan ve mevcut skoruu32olarak döndüren metot
İkinci impl bloğu — Skor modifikasyonları:
add_points—&mut selfvepoints: u32alan, puanları skora ekleyen metotreset_score—&mut selfalan ve skoru tekrar0yapan metot
Üç girdi alacaksınız:
- Birinci satır: oyuncunun adı (String)
- İkinci satır: ilk turda eklenecek puanlar (u32)
- Üçüncü satır: ikinci turda eklenecek puanlar (u32)
Player::new kullanarak bir oyuncu oluşturun, ilk tur puanlarını ekleyin, skoru yazdırın, ardından skoru sıfırlayın, ikinci tur puanlarını ekleyin ve final skorunu yazdırın.
Beklenen çıktı formatı:
{score_after_first_round}
{score_after_reset_and_second_round}Kopya kağıdı
Rust, daha iyi bir organizasyon için bir struct'ın metotlarını birden fazla impl bloğuna ayırmaya izin verir:
struct BankAccount {
balance: f64,
}
// First impl block
impl BankAccount {
fn new(initial: f64) -> BankAccount {
BankAccount { balance: initial }
}
fn balance(&self) -> f64 {
self.balance
}
}
// Second impl block
impl BankAccount {
fn deposit(&mut self, amount: f64) {
self.balance += amount;
}
fn withdraw(&mut self, amount: f64) {
self.balance -= amount;
}
}
Farklı impl bloklarındaki tüm metotlar sorunsuz bir şekilde birlikte çalışır:
let mut account = BankAccount::new(100.0);
account.deposit(50.0);
println!("{}", account.balance()); // 150
Bir struct'ın sahip olabileceği impl bloğu sayısında bir sınır yoktur. Bu desen, yapıcıları (constructors) değiştiren (mutating) metotlardan ayırmak gibi ilgili işlevleri gruplandırmak için kullanışlıdır.
Kendin dene
use std::io;
// TODO: name (String) ve score (u32) alanlarına sahip Player struct'ını tanımlayın
// TODO: İlk impl bloğu - Yapıcı (constructor) ve sorgu metotları (new, get_score)
// TODO: İkinci impl bloğu - Skor değiştirme metotları (add_points, reset_score)
fn main() {
let mut input = String::new();
// Oyuncu adını oku
io::stdin().read_line(&mut input).expect("Failed to read line");
let name = input.trim().to_string();
// İlk tur puanlarını oku
input.clear();
io::stdin().read_line(&mut input).expect("Failed to read line");
let first_round: u32 = input.trim().parse().expect("Invalid number");
// İkinci tur puanlarını oku
input.clear();
io::stdin().read_line(&mut input).expect("Failed to read line");
let second_round: u32 = input.trim().parse().expect("Invalid number");
// TODO: Player::new kullanarak bir oyuncu oluşturun
// TODO: İlk tur puanlarını ekleyin ve skoru yazdırın
// TODO: Skoru sıfırlayın
// TODO: İkinci tur puanlarını ekleyin ve final skorunu 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