示例来自李浩毅的“Hands on Scala”。第 5 章。
trait StrParser[T]{ def parse(s: String): T }
object StrParser{
implicit object ParseInt extends StrParser[Int]{
def parse(s: String) = s.toInt
}
implicit object ParseBoolean extends StrParser[Boolean]{
def parse(s: String) = s.toBoolean
}
implicit object ParseDouble extends StrParser[Double]{
def parse(s: String) = s.toDouble
}
}
def parseFromString[T](s: String)(implicit parser: StrParser[T]) = {
parser.parse(s)
}
implicit def ParseSeq[T](implicit p: StrParser[T]) = new StrParser[Seq[T]]{
def parse(s: String) = s.split(',').toSeq.map(p.parse)
}
parseFromString[Seq[Int]]("1,2,3")
ParseSeq 是类型为 Seq[T] 和隐式参数 p:StrParser[T] 的 StrParser 的构造函数。
还有一个用于类型 [T, V] 的 StrParser 构造函数
implicit def ParseTuple[T, V](implicit p1: StrParser[T], p2: StrParser[V]) =
new StrParser[(T, V)]{
def parse(s: String) = {
val Array(left, right) = s.split('=')
(p1.parse(left), p2.parse(right))
}
}
现在我们可以制作
parseFromString[Seq[(Int, Boolean)]]("1=true,2=false,3=true,4=false")
结果是 Seq[(Int, Boolean)] = ArraySeq((1,true), (2,false), (3,true), (4,false))