我有一个Scala的类型:
type Fingerprint = Seq[(Int, Int)]
我想重写此类型的
toString
方法,如何实现?我有一个Scala的类型:
type Fingerprint = Seq[(Int, Int)]
toString
方法,如何实现?使用基于类型类的方法来解决这种问题有很好的理由,而不是使用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
相比于基于隐式类或其他隐式转换的方法,更倾向于基于类型类的方法——因为通常情况下,类型类实例更易于推理和调试。
Show
很容易 - 我只是使用 Scalaz 的作为一个简单的例子。 - Travis Brown覆盖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
}