ProgramlamaRust backend geliştiricisi

Rust'ta ilişkili verilerle enums nasıl uygulanır ve bunların gerçek uygulamalarda işlenmesi için pattern matching nasıl kullanılır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Rust'ta enums yalnızca değerleri (variations) değil, aynı zamanda onlara bağlı verileri (payload) de saklayabilir. Bu, durumları veya parametrelerle mesajları temsil etmek için cebirsel veri tipleri oluşturmada özellikle kullanışlıdır. Örneğin:

enum Message { Quit, Move { x: i32, y: i32 }, Write(String), ChangeColor(i32, i32, i32), }

Bu tür enums'u işlemek için genellikle match operatörü kullanılır; bu, her bir varyantın iç içe geçmiş değerlerini açığa çıkarmamızı sağlar:

let msg = Message::Move { x: 10, y: 20 }; match msg { Message::Quit => println!("Quit message"), Message::Move { x, y } => println!("Move to ({}, {})", x, y), Message::Write(text) => println!("Text: {}", text), Message::ChangeColor(r, g, b) => println!("Change color to ({}, {}, {})", r, g, b), }

Bu yaklaşım, tüm olası durumları güvenli ve açık bir şekilde işlemeye olanak tanır; bu da programın mantığında hataları minimize eder.

Hileli Soru

Rust'ta neden enums için null yoktur ve mevcut bir varyantla eşleştirme denemesi ne döner?

Sık yapılan yanlış cevap: "Eğer match içinde tüm enum varyantları işlenmezse, derleyici hatayı atlar."

Aslında derleyici, tüm olası varyantlar dikkate alınmadıkça hatayı bildirir veya bir catch-all (_) eklemeyi zorunlu kılar. Örneğin:

enum Status { Ok, Err(String) } let st = Status::Ok; match st { Status::Ok => println!("Ok"), // Eğer Status::Err unutulursa, derleyici uyarı verir }

Konuyla ilgili bilgisi olmayanların gerçek hatalarına dair örnekler


Hikaye Bir projede enum genişletildiğinde, yeni varyantın kullanıldığı tüm yerlerde match içindeki işlenmeyi eklememek, testlerin tüm durumları kapsamadığı için bir panic! ile sonuçlandı.


Hikaye Başka bir durumda, ilişkili verilerle karmaşık varyantlar için PartialEq uygulanmadan enum'u basit == ile karşılaştırmaya çalışmak, beklenmedik bir derleme hatasına yol açtı.


Hikaye Takım, varyantları işlemek için catch-all (_) kullandı ve yeni varyantlar eklerken bu, mantığın yeni durumları sessizce göz ardı etmesine neden oldu ve bu da zor tespit edilen hatalara yol açtı.