2013-06-15 11 views

Antwort

11

Dies erfordert, dass Sie mehrere Parameterlisten verwenden:

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

Werte Standard nur auf Parameter in vorhergehenden Listen verweisen.

Vorsicht jedoch mit Fallklassen, weil ihre Gleichheit nimmt nur auf das Konto der ersten Parameterliste, daher:

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

Schöne Antwort. Das ist eine ziemliche Herausforderung bei der Verwendung von Fallklassen, und es ist immer noch nicht behoben ab 2.11.6. –

+0

Eigentlich halte ich es für ein nützliches Feature, um Parameter zu definieren, die nicht an Gleichheit und Hash teilnehmen. –

6

Da Sie für die Work-around gefragt, ob es nicht offensichtlich ist, wie caseness zu erhalten :

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

Ich finde diese Methode nützlicher, aber ich gebe 0 __ 's Antwort die Annahme, weil es beliebter scheint. –

+0

Eigentlich soll der grüne Check bedeuten, was dein Problem gelöst hat, wie auch immer du das definierst. Aber ich nehme an, Sie haben Ihr Problem vor ein paar Jahren gelöst. –

+0

Ja, im Nachhinein weiß ich nicht, warum ich die grünen Schecks gewechselt habe. –

Verwandte Themen