Değiştirilebilir Metotlar
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 3 / 61.
Bazen yöntemlerin verileri yalnızca okumanın ötesinde işlemler yapması gerekir. Verileri değiştirmeleri gerekir. Bir struct'ın alanlarını değiştirebilen yöntemler oluşturmak için &self yerine &mut self kullanırız.
mut anahtar sözcüğü, yönteme örneğin dahili durumunu değiştirme izni veren değiştirilebilir bir ödünç almayı 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 işlevlerinin value değerini değiştirdikleri için &mut self kullandığına, get işlevinin ise yalnızca verileri okuduğu için &self kullandığına dikkat edin.
Değiştirilebilir yöntemleri çağırırken örneğin kendisi değiştirilebilir olarak bildirilmelidir:
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 sözcüğünü unutursanız Rust, üzerinde herhangi bir &mut self yöntemini çağırmanızı engeller. Bu, verilerinizin ne zaman değişebileceğinin her zaman farkında olmanızı sağlar.
Görev
KolayTek bir alana sahip bir BankAccount yapısı oluşturun: balance (i32).
BankAccount için üç yöntem içeren bir uygulama 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:
- İlk satır: başlangıç bakiyesi (i32)
- İkinci satır: yatırma miktarı (i32)
- Üçüncü satır: çekme miktarı (i32)
Başlangıç bakiyesiyle değiştirilebilir bir BankAccount örneği oluşturun, ardından verilen miktarı yatırın, verilen miktarı çekin ve son bakiyeyi yazdırın.
Beklenen çıktı biçimi:
{final_balance}Kendin dene
use std::io;
// TODO: BankAccount struct'ını burada tanımla
// TODO: BankAccount için deposit, withdraw ve get_balance metodlarıyla implementation bloğunu ekle
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ırma tutarını oku
io::stdin().read_line(&mut input).expect("Failed to read line");
let deposit_amount: i32 = input.trim().parse().expect("Invalid number");
input.clear();
// Çekme tutarını 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 mutable bir BankAccount örneği oluştur
// TODO: deposit_amount ile deposit'i çağır
// TODO: withdraw_amount ile withdraw'u çağır
// TODO: get_balance kullanarak son bakiyeyi 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