Setter'lar
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 12 / 61.
Getter'lar harici kodun özel verileri okumasını sağlar. Peki ya bunların verileri değiştirmesine izin vermeniz gerekirse? İşte burada setter metotları devreye girer: özel alanları kontrollü bir şekilde değiştiren herkese açık metotlar.
Temel bir setter, &mut self ve yeni bir değer alır:
// wallet.rs
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Self { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
pub fn set_balance(&mut self, amount: f64) {
self.balance = amount;
}
}
Getter'ların aksine, Rust setter'ları genellikle veriyi değiştirdiklerini açıkça belirtmek için set_ ön ekini kullanır. &mut self parametresi gereklidir. Bu parametre, metoda yapının alanlarını değiştirme izni verir.
Setter'ların asıl gücü doğrulamadır. Herhangi bir değeri körü körüne kabul etmek yerine kuralları zorunlu kılabilirsin:
pub fn set_balance(&mut self, amount: f64) {
if amount >= 0.0 {
self.balance = amount;
}
// Negatif değerler sessizce yok sayılır
}
Artık cüzdan kendini koruyor: dış kod hangi değeri ayarlamaya çalışırsa çalışsın, bakiye hiçbir zaman negatif olamaz. Bu, kapsüllemenin iş başındaki hâlidir: yapı kendi değişmezlerini denetler ve dış kod onu geçersiz bir duruma sokamaz.
Görev
KolayVerileri geçerli tutmak için setter'ların kuralları nasıl zorunlu kılabileceğini gösteren bir termostat sistemi oluşturalım. Termostatınız, yalnızca güvenli bir aralık içinde ayarlanabilen bir sıcaklık ayarına sahip olacak.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
thermostat.rs: Özel birThermostatalanına (i32) sahip birtemperaturestruct'ı tanımlayın. Struct public olmalı, ancak geçersiz değerlerden korumak için alan private kalmalıdır. Şunları uygulayın:- Başlangıç sıcaklığını alan bir
newconstructor'ı - Mevcut sıcaklığı döndüren bir
temperaturegetter'ı - Yalnızca 10 ile 30 (dahil) arasındaki değerleri kabul eden bir
set_temperaturesetter'ı. Değer bu aralığın dışındaysa sıcaklık değişmeden kalmalıdır.
- Başlangıç sıcaklığını alan bir
main.rs: Thermostat modülünüzü içe aktarın, bir termostat oluşturun ve çeşitli sıcaklıkları ayarlamayı deneyerek ve her denemeden sonra sonucu yazdırarak setter'ın doğrulamasını gösterin.
Setter, geçersiz değerleri sessizce yok saymalıdır: hiçbir hata mesajı vermemeli, biri sıcaklığı geçerli aralığın dışına ayarlamayı denediğinde mevcut sıcaklığı değiştirmeden korumalıdır.
Çıktınız tam olarak şu biçimi izlemelidir:
Initial: {temperature}
After setting to {attempted_value}: {temperature}
After setting to {attempted_value}: {temperature}Örneğin, termostatı 20 değerinde oluşturur, ardından önce 25 (geçerli), sonra 50 (geçersiz) değerine ayarlamayı denerseniz çıktı şöyle olur:
Initial: 20
After setting to 25: 25
After setting to 50: 25Üç girdi alacaksınız: başlangıç sıcaklığı, ayarlanması denenecek ilk sıcaklık ve ayarlanması denenecek ikinci sıcaklık.
Kendin dene
mod thermostat;
use thermostat::Thermostat;
fn main() {
// Girdileri oku
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let initial_temp: i32 = input1.trim().parse().expect("Invalid number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let first_attempt: i32 = input2.trim().parse().expect("Invalid number");
let mut input3 = String::new();
std::io::stdin().read_line(&mut input3).expect("Failed to read line");
let second_attempt: i32 = input3.trim().parse().expect("Invalid number");
// TODO: Başlangıç sıcaklığıyla bir termostat oluştur
// TODO: Başlangıç sıcaklığını yazdır
// Biçim: "Initial: {temperature}"
// TODO: İlk sıcaklığı ayarlamayı dene ve sonucu yazdır
// Format: "After setting to {attempted_value}: {temperature}"
// TODO: İkinci sıcaklığı ayarlamayı dene ve sonucu yazdır
// Format: "After setting to {attempted_value}: {temperature}"
}
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