2014-12-14 14 views

risposta

19

OK qui è la risposta easist:

override def toString = ScalaRunTime._toString(this) 

fine della storia :)

+0

È ASCIUTTO e facile. –

+1

domanda noob: questo mi ha dato errori per diverse ragioni; Ho ottenuto questo lavoro: 'override def toString() = ScalaRunTime._toString (this)' (Ho dovuto aggiungere parenti dopo 'toString'). Inoltre, dovevo avere esplicitamente la mia particolare classe 'extend Product'. Un modo per evitarlo? (Inoltre, ho usato 'import scala.runtime.ScalaRunTime' per evitare di qualificare completamente il nome.) –

+2

@ not-just-yeti dichiarare come case case è equivalente ad estendere il prodotto. Altre parti sono correlate a scorciatoie scala in versioni diverse e non importanti. – tribbloid

7

Ecco una soluzione che penso possa funzionare, potrebbe essere troppa cerimonia, decidi tu. Si tratta di un trait.

trait StandardToString { this:Product => 
    override def toString = productPrefix + productIterator.mkString("(", ",", ")") 
} 

Ora provando con alcuni campioni:

trait Human { 
    override def toString() = "Human" 
} 

case class European(firstName:String) extends Human 

ed eseguirlo con il tratto:

scala> new European("Falco") with StandardToString 
res0: European with StandardToString = European(Falco) 

, naturalmente, con la trait si sono lasciati con

scala> new European("Adele") 
res1: European = Human 
1

E 'più preciso dire che la classe caso toString non viene generato, piuttosto che quello che viene ignorata.

Questa non è una soluzione o una soluzione.

scala> trait X { override def toString = "X" } 
defined trait X 

scala> case class Y(i: Int) extends X 
defined class Y 

scala> Y(42) 
res0: Y = X 

scala> case class Y(i: Int) 
defined class Y 

scala> class Z(x: Int) extends Y(x) with X { override def toString = super[Y].toString } 
defined class Z 

scala> new Z(42) 
res1: Z = Y(42) 

Non puoi farlo con un tratto:

scala> trait R extends Y { override def toString = super[Y].toString } 
<console>:9: error: Implementation restriction: traits may not select fields or methods from super[C] where C is a class 
     trait R extends Y { override def toString = super[Y].toString } 
               ^