2013-06-15 15 views
7

Bir parametrenin varsayılan değeri başka bir parametreye nasıl referans verebilir? Eğer yapamazsa, bunun etrafında nasıl çalışılır?Bir parametrenin varsayılan değeri başka bir parametreye nasıl referans verebilir?

case class A(val x:Int, val y:Int = x*2) 

Hata (makul yeterli):

case class A(x: Int)(y: Int = x*2) 

Varsayılan değerler de listeler önceki parametrelere başvurabilirsiniz:

scala> case class B(val x:Int, val y:Int = x*2) 
<console>:7: error: not found: value x 
    case class B(val x:Int, val y:Int = x*2) 
            ^

cevap

11

Bu, birden parametre listelerini kullanmanızı gerektirir. Onların eşitlik sadece dikkate ilk parametre listesini alır çünkü

nedenle, vaka sınıfları ile ancak dikkatli olun:

A(1)() == A(1)(3) // --> true!! 
+1

Güzel yanıt. Örnek sınıfları kullanırken bu oldukça zor ve hala 2.11.6'dan beri sabit değil. –

+0

Aslında, eşitlik ve karma katılmayan parametreler tanımlamak için yararlı bir özellik olduğunu düşünüyorum. –

6

Eğer iş çevresinde istedi yana, caseness korumak için nasıl belli değil ise :

scala> :pa 
// Entering paste mode (ctrl-D to finish) 

case class Foo(x: Int, y: Int) 
object Foo { 
    def apply(x: Int): Foo = apply(x, 2*x) 
} 

// Exiting paste mode, now interpreting. 

defined class Foo 
defined object Foo 

scala> Foo(5,6) 
res45: Foo = Foo(5,6) 

scala> Foo(5) 
res46: Foo = Foo(5,10) 
+0

Bu yöntemi daha kullanışlı buluyorum, ama daha çok popüler gibi göründüğünden, 0 __ 'ın kabulüne cevap veriyorum. –

+0

Aslında, yeşil onay probleminizi çözdüğünüz anlamına gelir, ancak bunu siz tanımlarsınız. Ama sanırım sorununuzu birkaç yıl önce çözdünüz. –

+0

Evet, geçmişe bakıldığında, neden yeşil çekleri değiştirdiğimi bilmiyorum. –

İlgili konular