Kafayı yiyecektim. C++'ta yazdığım, iç içe geçmiş 15 tane if-else ve switch'ten oluşan o koca, okunması zor bloğa bakıyordum. "Bu işin daha temiz bir yolu olmalı" diye düşünüp Rust'a geçiş yaptığımda, pattern matching ile tanıştım. İlk başta gözlerim doldu, bu bir sanat eseriydi! Ama sonra... exhaustive kontrol devreye girdi.
Rust'ın match ifadesi, C++'ın switch'ini utandırıyor. Sadece bir değeri değil, yapıyı (struct), tuple'ı, enum'un variant'ını, hatta içindeki değerleri bile dağıtıp eşleştirebiliyorsun. Tip güvenliği mükemmel. Şu örneğe bak:
Kod:
match mesaj {
Mesaj::Yaz { gonderen, icerik } => println!("{}: {}", gonderen, icerik),
Mesaj::TasinanDosya { yol, boyut } => println!("Dosya: {} ({} KB)", yol, boyut),
Mesaj::BaglantiKesildi => println!("Bağlantı koptu!"),
}
C++'ta bunu yapmak için belki bir sürü dynamic_cast veya tür sorgulaması gerekirdi. Burada her şey net ve derleyici senin için kontrol ediyor. Ama işte o "derleyici kontrolü" bazen...
Meğerse sorun şuradaymış: Rust derleyicisi, match bloğunun tüm olasılıkları (exhaustive) kapsamasını şart koşuyor. Yani enum'una yeni bir variant eklediğinde, onu işlemediğin tüm match bloklarında derleyici hata verip seni durduruyor. Bu, çalışma zamanı hatası olasılığını sıfıra indiren, inanılmaz bir güvenlik ağı.
Ama bazen, özellikle prototip aşamasında veya sadece belirli birkaç durumu önemsediğinizde, bu "detaycılık" biraz sıkıcı olabiliyor. "Tamam kardeşim, biliyorum diğer durumları, şimdilik _ => () yapıp geçeyim" diyesin geliyor. C++'ın switch'i bu konuda daha "rahat" - default case'i yazarsın ve olay biter, derleyici seni variant'ların hepsini yazmadın diye zorlamaz. Tabii bu rahatlık, unuttuğun bir case yüzünden saatlerce debug etmene de sebep olabilir.
Şaka gibi ama, Rust'ın bu zorlayıcılığı aslında uzun vadede zaman kazandırıyor. Uykusuz geçen, "acaba neden çalışmıyor?" diye debug ettiğim o C++ gecelerini düşününce, Rust'ın match'inin beni baştan uyarması daha iyi. Evet, bazen fazla didaktik geliyor, ama yazılımda "fazla güvenli" diye bir şey yok bence.
Siz ne düşünüyorsunuz? Pattern matching'in bu exhaustive kontrolü sizin için vazgeçilmez bir güvenlik mi, yoksa bazen gereksiz bir engel mi? C++'ta böyle bir sistemi [[fallthrough]] veya başka yöntemlerle taklit etmeye çalışan oldu mu?