覆盖scala类型的toString

时间:2014-01-24 12:49:16

标签: scala tostring

我在Scala中有一个类型:

  type Fingerprint = Seq[(Int, Int)]

我想覆盖此类型的toString。我怎么能这样做?

2 个答案:

答案 0 :(得分: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")
)

然后:

scala> Seq((1, 2), (3, 4), (5, 6)).shows
res0: String = 
1 2
3 4
5 6

基于隐式类或其他隐式转换,优先选择基于类的类方法也是有充分理由的 - 类型类实例通常更容易推理和调试。

答案 1 :(得分: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)

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

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