Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Verileri 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 bir Thermostat alanına (i32) sahip bir temperature struct'ı 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 new constructor'ı
    • Mevcut sıcaklığı döndüren bir temperature getter'ı
    • Yalnızca 10 ile 30 (dahil) arasındaki değerleri kabul eden bir set_temperature setter'ı. Değer bu aralığın dışındaysa sıcaklık değişmeden kalmalıdır.
  • 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}"
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Rust derleyicisi