我在Scala中有一个类型:
type Fingerprint = Seq[(Int, Int)]
Run Code Online (Sandbox Code Playgroud)
我想覆盖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")
)
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)
基于隐式类或其他隐式转换的类型基于类的方法也有很好的理由 - 类型类实例通常更容易推理和调试.
覆盖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)
归档时间: |
|
查看次数: |
1158 次 |
最近记录: |