Menu
Coddy logo textTech

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.

challenge icon

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 — bir name: String alan ve score değeri 0 olarak ayarlanmış bir Player döndüren ilişkili bir fonksiyon
  • get_score&self alan ve mevcut skoru u32 olarak döndüren metot

İkinci impl bloğu — Skor modifikasyonları:

  • add_points&mut self ve points: u32 alan, puanları skora ekleyen metot
  • reset_score&mut self alan ve skoru tekrar 0 yapan 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
}
quiz iconKendini test et

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