Rust'ta PartialEq ve Eq trait'leri, type safety felsefesinden doğar — koleksiyonlarla ilgili tüm temel işlemler (HashMap, HashSet) eşitliğin titiz bir tanımına dayanır. Bu trait'ler, iki tür nesnenin == ile karşılaştırılıp karşılaştırılamayacağını ve türün "tam" eşitlik (Eq) veya "kısmi" (PartialEq) sağlamak zorunda olup olmadığını belirler.
PartialEq/Eq'nin yanlış uygulanması koleksiyonların düzgün çalışmamasına neden olur; burada temel matematiksel özellikler ihlal edilir: kendisiyle karşılaştırma, simetri, geçişkenlik. Ayrıca, hatalı bir Eq, nesnelerin koleksiyonlarda "kaybolmasına" veya beklenmedik kopyaların oluşmasına neden olabilir.
PartialEq, karşılaştırmanın tüm değerler için mümkün olmadığı türler için uygulanır (örneğin, f32, burada NaN != NaN). Eq yalnızca "titiz" (tam) ilişkiler için tasarlanmıştır. Kullanıcı tanımlı türler, bu sözleşmelere titizlikle uyarak karşılaştırmayı gerçekleştirmelidir.
Kod örneği:
#[derive(PartialEq, Eq)] struct Point { x: i32, y: i32, } let p1 = Point { x: 1, y: 2 }; let p2 = Point { x: 1, y: 2 }; assert!(p1 == p2); // true
Ana özellikler:
Neden f32 türü için standart kütüphane sadece PartialEq, ancak Eq'yi uygulamıyor?
Çünkü IEEE-754'e göre NaN != NaN, yani tüm x için x == x özelliği sağlanmamaktadır ve bu da Eq için gerekli bir özelliktir.
Eğer PartialEq manuel olarak uygulanmışsa, Eq'yi açıkça uygulamak zorunlu mu?
Evet, eğer tür tam eşitliği destekliyorsa (x == x her zaman true), Eq'nin de manuel olarak uygulanması gerekmektedir, aksi takdirde bazı yapılar sizin türünüzle derlenmeyecektir.
Kullanıcı, PartialEq'yi "asimetrik" olarak (x == y, ancak y != x) uygulayabilir mi?
Teknik olarak evet, ancak bu koleksiyonların düzgün çalışmamasına yol açar ve bir hata olarak kabul edilir.
**Olumsuz örnek
Kullanıcı, yalnızca bir alan üzerinden karşılaştırma yapan bir tür için PartialEq'yi uyguladı, diğer alanlar göz ardı edildi. Sonuç olarak, HashSet "kopyaları kaybetti".
Artılar:
Eksiler:
**Olumlu örnek
#[derive(PartialEq, Eq)]'yi kullanır veya tüm iş mantığını dikkate alan kendi karşılaştırma sürümünü uygular, gerekli özellikleri güvence altına alır.
Artılar:
Eksiler: