我在Scala中有一个类型:
type Fingerprint = Seq[(Int, Int)]
我想覆盖此类型的toString
。我怎么能这样做?
答案 0 :(得分:8)
有充分的理由使用基于类的类型方法来解决这类问题,而不是使用Scala的toString
(这可能只是一个令人不愉快的Java手工),而且事实上你可以在任意类型上绑定toString
就是其中之一。例如,您可以使用Scalaz的Show
类型类来编写以下内容:
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
}