覆盖scala类型的toString

Dan*_*ier 7 scala tostring

我在Scala中有一个类型:

  type Fingerprint = Seq[(Int, Int)]
Run Code Online (Sandbox Code Playgroud)

我想覆盖toString这种类型.我怎样才能做到这一点?

Tra*_*own 8

有充分的理由使用基于类的类型方法来解决这类问题,而不是使用Scala toString(可以说这只是一种令人不快的Java手工操作),以及你无法toString对任意类型进行操作的事实是其中之一.例如,您可以使用ScalazShow类型类编写以下内容:

import scalaz._, syntax.show._

implicit val fingerprintShow: Show[Fingerprint] = Show.shows(
  _.map(p => p._1 + " " + p._2).mkString("\n")
)
Run Code Online (Sandbox Code Playgroud)

然后:

scala> Seq((1, 2), (3, 4), (5, 6)).shows
res0: String = 
1 2
3 4
5 6
Run Code Online (Sandbox Code Playgroud)

基于隐式类或其他隐式转换的类型基于类的方法也有很好的理由 - 类型类实例通常更容易推理和调试.

  • scalaz很棒,但为打印添加一个庞大的库有点矫枉过正. (2认同)

fla*_*ian 5

覆盖toString可能不是这里的最佳选择,但有一个简单的替代方案:

implicit class SeqAug[T <: (_, _)](val seq: Seq[T]) {
   def showInfo: String = {
      seq.map(p => p._1 + " " + p._2).mkString("\n") // or whatever you want.
   }
}
val x = Seq(("test" -> 5))
Console.println(x.showInfo)
Run Code Online (Sandbox Code Playgroud)

您甚至可以限制扩充的界限:

type Fingerprint = Seq[(Int, Int)]
implicit class SeqAug(val fingerprint: Fingerprint) {
  // same thing
}
Run Code Online (Sandbox Code Playgroud)