Birden Fazla Uygulama Bloğu
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 5 / 61.
Rust, bir yapının yöntemlerini birden fazla impl bloğuna bölmenize 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 uygulama bloğuna ayrılmış bir yapı aşağıda verilmiştir:
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, yapılarınız büyüdükçe özellikle kullanışlı hâle gelir. Oluşturucuları birlikte gruplandırabilir, salt okunur yöntemleri değişiklik yapanlardan ayrı tutabilir veya özelliğe göre düzenleyebilirsiniz. Bir yapının sahip olabileceği impl bloklarının sayısında sınır yoktur.
Görev
Kolayİki alana sahip bir Player yapısı oluştur: name (String) ve score (u32).
Yapının metotlarını iki ayrı uygulama bloğunda düzenle:
İlk impl bloğu: Oluşturucu ve sorgu:
new:name: Stringalan vescoredeğeri0olarak ayarlanmış birPlayerdöndüren ilişkili bir işlevget_score:&selfalan ve geçerli skoruu32olarak döndüren işlev
İkinci impl bloğu: Skor değişiklikleri:
add_points:&mut selfvepoints: u32alan, puanları skora ekleyen işlevreset_score:&mut selfalan ve skoru tekrar0olarak ayarlayan işlev
Üç girdi alacaksın:
- İlk 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ştur, ilk tur puanlarını ekle, skoru yazdır, ardından skoru sıfırla, ikinci tur puanlarını ekle ve final skorunu 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.
Nesne Yönelimli Programlama 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