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 yöntemlerini birden fazla impl bloğuna ayırmanıza olanak tanır. Her şey tek bir blokta yer alabilse de bunları ayırmak kodunuzu daha düzenli ve okunabilir hâle getirebilir.
İşlevselliği iki implementation bloğuna ayrılmış bir struct:
struct BankAccount {
balance: f64,
}
// Yapıcı 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 bakmaksı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ı hâle gelir. Constructor'ları birlikte gruplayabilir, salt okunur methods'ları değişiklik yapan methods'lardan ayrı tutabilir veya özelliğe göre düzenleyebilirsiniz. Bir struct'ın sahip olabileceği impl block'larının sayısında sınır yoktur.
Görev
Kolayİki alana sahip bir Player struct'ı oluştur: name (String) ve score (u32).
struct'ın yöntemlerini iki ayrı impl bloğu arasında düzenle:
First impl block: Constructor ve sorgu:
new: birname: Stringalan vescoredeğeri0olarak ayarlanmış birPlayerdöndüren ilişkili bir fonksiyonget_score:&selfalan ve mevcut skoruu32olarak döndüren fonksiyon
Second impl block: Skor değişiklikleri:
add_points:&mut selfvepoints: u32alan, puanları skora ekleyen fonksiyonreset_score:&mut selfalan ve skoru tekrar0olarak ayarlayan fonksiyon
Üç girdi alacaksın:
- İlk satır: oyuncunun adı (String)
- İkinci satır: ilk round'da eklenecek puanlar (u32)
- Üçüncü satır: ikinci round'da eklenecek puanlar (u32)
Player::new kullanarak bir oyuncu oluştur, ilk round puanlarını ekle, skoru yazdır, ardından skoru sıfırla, ikinci round puanlarını ekle ve final skoru yazdır.
Beklenen çıktı biçimi:
{score_after_first_round}
{score_after_reset_and_second_round}Kendin dene
use std::io;
// TODO: Player struct'ını name (String) ve score (u32) alanlarıyla tanımla
// TODO: İlk impl bloğu - Yapıcı 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ştur
// TODO: İlk tur puanlarını ekle ve skoru yazdır
// TODO: Skoru sıfırla
// TODO: İkinci tur puanlarını ekle ve final skoru yazdır
}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 PlayerKendi başına pratik yap: Online Rust derleyicisi