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.
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:
new—bolddeğerifalse,italicdeğerifalsevesizedeğeri12olarak ayarlanmış birTextStyledöndüren ilişkili bir fonksiyonset_bold—&mut selfve birbooldeğeri alır, bold alanını ayarlar ve zincirleme (chaining) için&mut Selfdöndürürset_italic—&mut selfve birbooldeğeri alır, italic alanını ayarlar ve zincirleme (chaining) için&mut Selfdöndürürset_size—&mut selfve biru32değeri alır, size alanını ayarlar ve zincirleme (chaining) için&mut Selfdöndürür
Üç girdi alacaksınız:
- Birinci satır: bold ayarı (
trueveyafalse) - İkinci satır: italic ayarı (
trueveyafalse) - Üçü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}
}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