Menu
Coddy logo textTech

Değiştirilebilir Metotlar

Coddy'nin Rust Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 3 / 61.

Bazen metotların veriyi sadece okumaktan daha fazlasını yapması gerekir; onu değiştirmeleri gerekir. Bir yapının (struct) alanlarını değiştirebilen metotlar oluşturmak için, &self yerine &mut self kullanırız.

mut anahtar kelimesi, metoda örneğin iç durumunu değiştirme izni veren değiştirilebilir bir ödünç almayı (mutable borrow) belirtir:

struct Counter {
    value: i32,
}

impl Counter {
    fn increment(&mut self) {
        self.value += 1;
    }
    
    fn decrement(&mut self) {
        self.value -= 1;
    }
    
    fn get(&self) -> i32 {
        self.value
    }
}

increment ve decrement'in value değerini değiştirdikleri için &mut self kullandığına, get'in ise sadece veriyi okuduğu için &self kullandığına dikkat edin.

Değiştirilebilir (mutable) metotlar çağrılırken, örneğin (instance) kendisi de değiştirilebilir olarak tanımlanmalıdır:

fn main() {
    let mut counter = Counter { value: 0 };
    
    counter.increment();
    counter.increment();
    println!("{}", counter.get()); // 2
    
    counter.decrement();
    println!("{}", counter.get()); // 1
}

Örneği oluştururken mut anahtar kelimesini unutursanız, Rust onun üzerinde herhangi bir &mut self metodunu çağırmanızı engelleyecektir. Bu, verilerinizin ne zaman değişebileceğinin her zaman farkında olmanızı sağlar.

challenge icon

Görev

Kolay

Tek bir alana sahip bir BankAccount struct'ı oluşturun: balance (i32).

BankAccount için üç metot içeren bir uygulama (implementation) bloğu ekleyin:

  • deposit&mut self ve bir amount: i32 alır, miktarı bakiyeye ekler
  • withdraw&mut self ve bir amount: i32 alır, miktarı bakiyeden çıkarır
  • get_balance&self alır ve mevcut bakiyeyi i32 olarak döndürür

Üç girdi alacaksınız:

  • Birinci satır: başlangıç bakiyesi (i32)
  • İkinci satır: yatırılacak miktar (i32)
  • Üçüncü satır: çekilecek miktar (i32)

Başlangıç bakiyesi ile değiştirilebilir (mutable) bir BankAccount örneği oluşturun, ardından verilen miktarı yatırın, verilen miktarı çekin ve son bakiyeyi yazdırın.

Beklenen çıktı formatı:

{final_balance}

Kopya kağıdı

Struct alanlarını değiştiren metotlar &mut self (değiştirilebilir ödünç alma) kullanırken, yalnızca veriyi okuyan metotlar &self kullanır:

struct Counter {
    value: i32,
}

impl Counter {
    fn increment(&mut self) {
        self.value += 1;
    }
    
    fn decrement(&mut self) {
        self.value -= 1;
    }
    
    fn get(&self) -> i32 {
        self.value
    }
}

Değiştirilebilir (mutable) metotları çağırmak için, örneğin let mut ile değiştirilebilir olarak tanımlanması gerekir:

let mut counter = Counter { value: 0 };

counter.increment();
counter.increment();
println!("{}", counter.get()); // 2

counter.decrement();
println!("{}", counter.get()); // 1

Örnek üzerinde mut anahtar kelimesi olmadan, Rust herhangi bir &mut self metodunun çağrılmasını engelleyecektir.

Kendin dene

use std::io;

// TODO: BankAccount struct'ını burada tanımlayın


// TODO: BankAccount için deposit, withdraw ve get_balance metotlarını içeren uygulama bloğunu ekleyin


fn main() {
    let mut input = String::new();
    
    // Başlangıç bakiyesini oku
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let initial_balance: i32 = input.trim().parse().expect("Invalid number");
    
    input.clear();
    
    // Yatırılacak tutarı oku
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let deposit_amount: i32 = input.trim().parse().expect("Invalid number");
    
    input.clear();
    
    // Çekilecek tutarı oku
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let withdraw_amount: i32 = input.trim().parse().expect("Invalid number");
    
    // TODO: initial_balance ile değiştirilebilir (mutable) bir BankAccount örneği oluşturun
    // TODO: deposit_amount ile deposit metodunu çağırın
    // TODO: withdraw_amount ile withdraw metodunu çağırın
    // TODO: get_balance kullanarak güncel bakiyeyi 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