2016-04-05 33 views
6

Ben mevcut türlerine yeni fonksiyonlar eklemek çalışıyorum trait için. Bunu yapmak için örtük sınıfları ve örtülü dönüşümleri araştırdım ve her ikisi de aynı davranışı sunuyor gibi görünüyor. örtük dönüştürmeÖrtülü sınıf (Ben <code>Future[Option[A]]</code> örneğin üzerinde kontrol yok türleri için ilgili fonksiyonları önermek yüzden IDE otomatik olabilir)

case class Foo(a: Int) 
implicit class EnrichedFoo(foo: Foo) { 
    def beep = "boop" 
} 
Foo(1).beep // "boop" 

Ve kullanarak:

case class Foo(a: Int) 
trait Enriched { 
    def beep: String 
} 
implicit def fooToEnriched(foo: Foo) = new Enriched { 
    def beep = "boop" 
} 
Foo(1).beep // "boop" 

Burada tek fark ilk örnek bir bir- yarattığını olabilir varsayalım

örtük sınıfını kullanarak arasında herhangi bir fark var mı etkili bir özellik yerine sınıf dışında, ancak örtük sınıfı soyut bir özelliği genişletmek için kolayca uyarlayabilirim, örneğin:

case class Foo(a: Int) 
trait Enriched { 
    def beep: String 
} 
implicit class EnrichedFoo(foo: Foo) extends Enriched { 
    def beep = "boop" 
} 
Foo(1).beep // "boop" 

cevap

5

Bildiğim kadarıyla, hemen hemen aynı. Kapsam belirleme kuralları da her ikisi için de geçerlidir. Bence

, Durumun senin tür implicit classes kullanmayı tercih ediyorum. Muhtemelen tam olarak böyle bir şey için yaratılmışlardı. Zaten aslında sınıfların iki farklı tür ve ikisi arasında dönüştürmek istediğinizde

Örtük dönüştürmeler, bana göre, daha uygundur.

yeni dil oluşumu başka bir türe uzatma yöntemleri sağlamak sınıfların oluşturulmasını basitleştirmek için önerilmiştir:

Ne yazdığını Orada örtülü sınıfları right here. için ilk teklifi göz atabilirsiniz.

implicit classes'un nasıl desugars olduğunu görebilirsiniz. Aşağıdaki: Bana Eh

class RichInt(n: Int) extends Ordered[Int] { 
    def min(m: Int): Int = if (n <= m) n else m 
    ... 
} 
implicit final def RichInt(n: Int): RichInt = new RichInt(n) 
+1

ek bir şey örtük B * 'nihai class' *, bir' örtülü def' tek seçenek olduğunu tip B, bir nesneye tip A'nın bir nesneyi dönüştürmek istediğinizde, olmasıdır. – Adowrath

0

tercih onun meselesi:

implicit class RichInt(n: Int) extends Ordered[Int] { 
    def min(m: Int): Int = if (n <= m) n else m 
    ... 
} 

içine desugar edecektir. Aslında implicit classes, başka bir türe genişletme yöntemleri sağlayan sınıfların oluşturulmasını kolaylaştırmak için ortaya çıktı. Örtük sınıflar, value classes'a çok değer katıyor olsalar da. söz