如何避免scala的case类默认toString函数被覆盖?

tri*_*oid 12 scala case-class

Scala案例类具有默认的toString函数.但是当这个case类使用现有的toString()函数扩展一个特征时,它将变得无用.我该如何防止这种情况?

tri*_*oid 24

好的,这是一个简单的答案:

override def toString = ScalaRunTime._toString(this)
Run Code Online (Sandbox Code Playgroud)

故事结局:)

  • @ not-just-yeti声明为case类相当于扩展Product.其他部分与不同版本的scala快捷方式有关,并不重要. (3认同)
  • noob问题:由于几个原因,这给了我错误; 我得到了这个工作:`覆盖def toString()= ScalaRunTime._toString(this)`(我必须在`toString`之后添加parens).而且,我必须明确地使用我的特定类`extend Product`.有什么办法可以避免这个吗 (另外,我使用`import scala.runtime.ScalaRunTime`来避免完全限定名称.) (2认同)

Dan*_*osa 8

这是我认为可行的解决方法,可能是太多的仪式,你决定.它涉及到trait.

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

现在尝试一些样本:

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

case class European(firstName:String) extends Human
Run Code Online (Sandbox Code Playgroud)

并使用特征运行它:

scala> new European("Falco") with StandardToString
res0: European with StandardToString = European(Falco)
Run Code Online (Sandbox Code Playgroud)

当然,trait你留下了

scala> new European("Adele")
res1: European = Human
Run Code Online (Sandbox Code Playgroud)