Menu
Coddy logo textTech

Metot Zincirleme

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

Şu ana kadar, değiştirilebilir (mutable) metotlarımız yapıyı (struct) değiştirdi ve hiçbir şey döndürmedi. Peki ya aynı örnek (instance) üzerinde arka arkaya birkaç metot çağırmak istersek? self referansı döndürerek, birden fazla metot çağrısının tek bir ifadede aktığı bir desen olan metot zincirlemeyi (method chaining) mümkün kılarız.

İşin püf noktası, &mut self metotlarınızın &mut Self döndürmesini sağlamaktır:

struct Config {
    debug: bool,
    timeout: u32,
}

impl Config {
    fn new() -> Config {
        Config { debug: false, timeout: 30 }
    }
    
    fn set_debug(&mut self, value: bool) -> &mut Self {
        self.debug = value;
        self
    }
    
    fn set_timeout(&mut self, seconds: u32) -> &mut Self {
        self.timeout = seconds;
        self
    }
}

Her metot yapıyı değiştirir, ardından self—aynı örneğe geri dönen değiştirilebilir bir referans—döndürür. Bu, bir sonraki metot çağrısının hemen üzerinde çalışmaya devam etmesini sağlar:

fn main() {
    let mut config = Config::new();
    
    config.set_debug(true).set_timeout(60);
    
    println!("Debug: {}, Timeout: {}", config.debug, config.timeout);
    // Çıktı: Debug: true, Timeout: 60
}

Üç ayrı ifade yazmak yerine, her şeyi tek bir akıcı satırda yapılandırıyoruz. Bu "builder-style" deseni, özellikle birçok isteğe bağlı ayara sahip nesneleri kurarken kullanışlıdır ve kodunuzu daha kısa ve okunabilir hale getirir.

challenge icon

Görev

Kolay

Üç alana sahip bir TextStyle struct'ı oluşturun: bold (bool), italic (bool) ve size (u32).

TextStyle için aşağıdakileri içeren bir uygulama (implementation) bloğu ekleyin:

  • newbold değeri false, italic değeri false ve size değeri 12 olarak ayarlanmış bir TextStyle döndüren ilişkili bir fonksiyon
  • set_bold&mut self ve bir bool değeri alır, bold alanını ayarlar ve zincirleme (chaining) için &mut Self döndürür
  • set_italic&mut self ve bir bool değeri alır, italic alanını ayarlar ve zincirleme (chaining) için &mut Self döndürür
  • set_size&mut self ve bir u32 değeri alır, size alanını ayarlar ve zincirleme (chaining) için &mut Self döndürür

Üç girdi alacaksınız:

  • Birinci satır: bold ayarı (true veya false)
  • İkinci satır: italic ayarı (true veya false)
  • Üçüncü satır: font boyutu (u32)

new kullanarak değiştirilebilir (mutable) bir TextStyle oluşturun, ardından her üç ayarı tek bir ifadede uygulamak için metot zincirlemeyi (method chaining) kullanın. Nihai durumu aşağıda gösterilen formatta yazdırın.

Beklenen çıktı formatı:

Bold: {bold}, Italic: {italic}, Size: {size}

Kopya kağıdı

&mut self alan metotlar, metot zincirlemeye (method chaining) olanak tanımak için &mut Self döndürebilir:

impl Config {
    fn set_debug(&mut self, value: bool) -> &mut Self {
        self.debug = value;
        self
    }
    
    fn set_timeout(&mut self, seconds: u32) -> &mut Self {
        self.timeout = seconds;
        self
    }
}

Bu, tek bir ifadede birden fazla metot çağrısı yapılmasına olanak tanır:

let mut config = Config::new();
config.set_debug(true).set_timeout(60);

Her metot yapıyı değiştirir ve aynı örneğe ait değiştirilebilir bir referans döndürür; bu da bir sonraki metodun hemen onun üzerinde çalışmaya devam etmesine olanak tanır.

Kendin dene

use std::io;

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


// TODO: TextStyle için şu özellikleri içeren uygulama bloğunu ekleyin:
// - new() ilişkili fonksiyonu
// - set_bold() metodu
// - set_italic() metodu
// - set_size() metodu


fn main() {
    let mut input = String::new();
    
    // Kalın (bold) ayarını oku
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let bold: bool = input.trim().parse().expect("Invalid bool");
    input.clear();
    
    // İtalik ayarını oku
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let italic: bool = input.trim().parse().expect("Invalid bool");
    input.clear();
    
    // Boyut ayarını oku
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let size: u32 = input.trim().parse().expect("Invalid u32");
    
    // TODO: new() kullanarak değiştirilebilir bir TextStyle oluşturun, ardından
    // üç ayarı da tek bir ifadede uygulamak için metot zincirlemesini (method chaining) kullanın
    
    
    // TODO: Sonucu şu formatta yazdırın: Bold: {bold}, Italic: {italic}, Size: {size}
    
}
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