ProgramlamaRust geliştirici

Rust'ta pattern matching ve destructuring nasıl çalışır ve bunları kullanırken hangi inceliklere dikkat etmek gerekir?

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

Cevap

Pattern matching Rust'ta değerleri yapısına göre parçalamaya, karmaşık türleri match, if let, while let yapılarıyla analiz etmeye ve işlemeye olanak tanır. Destructuring (parçalara ayırma) tuplelar, yapılar, enum'lar ve hatta referanslarla çalışmak için kullanışlıdır.

Enum örneği:

enum Message { Quit, ChangeColor(i32, i32, i32), Write(String), } let m = Message::ChangeColor(255, 0, 0); match m { Message::Quit => println!("Quit!"), Message::ChangeColor(r, g, b) => println!("Renk: {} {} {}", r, g, b), Message::Write(text) => println!("Metin: {}", text), }

Yapıları dondurma:

struct Point { x: i32, y: i32 } let p = Point { x: 10, y: 20 }; let Point { x, y } = p;

İncelikler:

  • ref ve ref mut kullanarak parçalama sırasında referans almak mümkündür.
  • @ ile pattern'in bir kısmını "yeniden adlandırmak" mümkündür.
  • Değerler, aralıklar, koşullar (if guard) ile eşleştirme yapılabilir.
  • Referansların parçalanmasında (&SomeType) sahiplik ve borrowing konularına dikkat edilmelidir.

Soru ile aldatma

Pattern'in kısımlarını görmezden gelmek ve derleyici uyarılarından kaçınmak için her zaman "_" (alt çizgi) kullanabilir miyiz?

Her zaman değil. Alt çizgi gerçekten değeri atlar, ancak enum'un tüm seçeneklerini işleme almazsanız ve yeni bir enum seçeneği eklendiğinde "_" kullanıyorsanız, yeni seçeneklerin işlenmesini gözden kaçırabilirsiniz. Derleyicinin gözden geçirilmemiş durumlar hakkında uyarı vermesi için her zaman önemli seçenekleri açıkça belirtmek daha iyidir!

match result { Ok(val) => ..., Err(err) => ..., //_ => ... // enum için önerilmez! }

Konunun incelikleri hakkında gerçek hatalar örnekleri


Hikaye

IoT uygulamasında, pattern matching'de yeni bir enum seçeneği eklenirken catch-all "_" kullanılması nedeniyle cihaz yanıt vermeyi bıraktı. Hata, dağıtıma kadar görünmez kaldı. Bu nedenle, kritik enum'lar her zaman açık seçeneklerle ele alındı.


Hikaye

İç içe tuple'lara sahip karmaşık bir yapıda, dondurma sözdizimini eklemeyi unuttuk ve referans almak yerine kodlar büyük nesneleri yanlışlıkla kopyaladılar, bu da performans düşüşüne yol açtı.


Hikaye

Bir iş parçacıkları arasında mesaj iletimi işlevinde if-let ile dondurma kullanıldı ancak enum'un nadir seçeneklerini görmezden geldik. Yeni iş mantığıyla mesajlar sadece kayboldu. Daha sonra takım tarzında her match ifadesinin catch-all olmadan kapsamlı olması kuralı belirlendi.