Scala case class ha una funzione toString predefinita. Ma quando questa classe di casi estende una caratteristica con una funzione toString() esistente, sarà resa inutilizzabile. Come posso evitare questa situazione?Come evitare che la funzione toString predefinita della classe case di scala venga sovrascritta?
risposta
OK qui è la risposta easist:
override def toString = ScalaRunTime._toString(this)
fine della storia :)
È ASCIUTTO e facile. –
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.) –
@ 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
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
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 }
^
C'è una domanda simile a: http://stackoverflow.com/questions/20998866/scala-prevent-mixing-methods –