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.
Görev
KolayTek bir alana sahip bir BankAccount struct'ı oluşturun: balance (i32).
BankAccount için üç metot içeren bir uygulama (implementation) bloğu ekleyin:
deposit—&mut selfve biramount: i32alır, miktarı bakiyeye eklerwithdraw—&mut selfve biramount: i32alır, miktarı bakiyeden çıkarırget_balance—&selfalır ve mevcut bakiyeyii32olarak 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
}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