2015-04-19 17 views
10

Referans eşitliğinin hiçbir zaman equals'un doğru şekilde uygulanması olmadığını bildiğim bir özellik var. Özelliğin uygulamaları pek çok kullanıcı tarafından yazılabilir ve pratikte bazen equals'u geçersiz kılmayabilir. Bunu gerektirecek bir yolu var mı? Uygulama uygulamalardaBir özelliğin tüm uygulamalarının geçersiz kılınması için zorlanması

geçersiz kılan equals otomatik olarak genellikle durumda sınıfları vardır, ve özellik kendi kendini türü olarak Product sahip olarak bu gerektiren yaklaşım olabilir, ancak, sigara sağlayan bir çözüm görmek istiyorum equals'u da geçersiz kılan sınıf sınıfları (DÜZENLEME: Kendi türü olarak scala.Equals'u kullanmak istediğim şeye daha yakın bir yaklaşımdır, çünkü hala vaka sınıfları tarafından otomatik olarak uygulanır, ancak vakalar tarafından yararlı bir şekilde uygulanabilir. uygulamalar yazan insanlar üzerindeki büyük yük.

Bu soruyu yazarken aklıma gelen bir diğer yaklaşım da, soyut bir yöntem çağrısında bulunmak için equals numarasını geçersiz kılmaktır, ancak maalesef bu durum vaka sınıfı uygulamaları için işe yaramamaktadır.

+1

Peki - özellik Foo { kılma def eşittir (obj: scala. Any): Boole = ??? } – Maxim

+0

Örnek sınıf uygulamaları için _doesn't hakkında daha fazla bilgi verir misiniz? [Bu çalışma sayfası] (https://gist.github.com/Odomontois/865d91180cc2e30435bf) benim için iyi çalıştı – Odomontois

+0

@Maxim Sorun, "eşittir" bir vaka sınıfının bir atağında yeniden tanımlandığında, uygulamanın oluşturulmadığıdır. –

cevap

2

Neden saf karakter yerine typeclass sözleşmesi kullanmıyorsunuz? scalaz yılında We have one already ve Equals özelliği ile tutkal kolay:

import scalaz._ 

case class X(a:Int,b:Int) 

class Y(a:Int,b:Int) 

implicit def provideDefaultEqual[T <: Equals]:Equal[T] = new Equal[T] { 
    def equal(a1: T, a2: T) = a1 == a2 
} 

implicitly[Equal[X]] 

implicitly[Equal[Y]] //compile error 

Eğer özelliği ile bu tel gerekiyorsa, there is your own nice solution

İlgili konular