Soru Tarihi
Rust'taki match operatörü, fonksiyonel dillerden alınmış güçlü bir desen eşleştirme aracıdır. C/C++’taki karşıtlarından farklı olarak, Rust'ta yoğun bir tükenlilik kontrolü (exhaustiveness checking) uygulanır ve her olası duruma karşılık gelen kolların olması gerekir.
Sorun
Match ile çalışırken karşılaşılan hatalar genellikle türün (örneğin, enum) tüm olasılıklarının yanlış ele alınması, guard'larla (kollar üzerindeki koşullar) hatalı çalışma veya karmaşık iç içe yapılarla ilgilidir. Yanlış işlem, derleme aşamasında hatalara veya dolaylı olarak yanlış bir mantığa yol açar.
Çözüm
_).if desenden sonra) tamamlar.Kod örneği:
enum Shape { Circle(f64), Rectangle { width: f64, height: f64 }, } fn print_area(s: Shape) { match s { Shape::Circle(r) if r > 0.0 => println!("alan = {}", 3.14 * r * r), Shape::Rectangle { width, height } if width > 0.0 && height > 0.0 => println!("alan = {}", width * height), _ => println!("geçersiz şekil"), } }
Ana özellikler:
Match içindeki kolların sırası işlemeyi etkiler mi?
Evet, kolların sırası önemlidir: ilk eşleşme bulunduğunda, sonraki kontroller yapılmaz. Bu özellikle pattern guard ile kritik öneme sahiptir — eğer bir guard olan kol daha önce yer alıyorsa, catch-all'dan önceki değeri yakalar.
Enum için match kullanırken catch-all (_) zorunlu mu?
Hayır, tüm durumları açıkça ele almışsanız (ve türün tanımındaki olasılıklar zamanla değişmeyecekse) gerekmez. Ancak, ek değerler eklenebilecek türlerle veya tüm kolları açıkça ele almak istemiyorsanız catch-all gereklidir.
Match içinde bir kol içinde birden fazla desen (alternatifler) kullanılabilir mi?
Evet. Dikey çizgi (|) kullanarak desenleri birleştirebilirsiniz:
match x { 1 | 2 | 3 => println!("bir, iki veya üç"), _ => println!("başka bir şey"), }
_ kullanılmasıBir geliştirici, başta catch-all ile bir match yazdı ve özel durumları doğru bir şekilde ele alamadı.
Artılar:
Program derleniyor.
Eksiler:
Özel mantık asla çalışmıyor, kodun bir kısmı kapsamıyor.
Tüm enum durumlarının açıkça ele alınması, catch-all yalnızca son kolda, alışılmadık durumlar için ayrı guard'lar.
Artılar:
Öngörülebilirlik, derleyici durumu unutmamaya yardımcı oluyor, türleri genişletmek kolay.
Eksiler:
Çok sayıda durum için ek şablon kodu gerektiriyor.