字符串插值器作为提取器
也可以使用 Scala 的字符串插值功能来创建精细的提取器(模式匹配器),这可能是 Scala 宏的 quasiquotes API 中最常用的。
鉴于 n"p0${i0}p1"
去了 new StringContext("p0", "p1").n(i0)
,通过提供从 StringContext
到具有定义 unapply
或 unapplySeq
方法的类型属性 n
的类的隐式转换来启用提取器功能也许并不令人惊讶。
例如,考虑以下提取器,它通过从 StringContext
部分构造正则表达式来提取路径段。然后,我们可以将大部分繁重的工作委托给由生成的 scala.util.matching.Regex 提供的 unapplySeq
方法 :
implicit class PathExtractor(sc: StringContext) {
object path {
def unapplySeq(str: String): Option[Seq[String]] =
sc.parts.map(Regex.quote).mkString("^", "([^/]+)", "$").r.unapplySeq(str)
}
}
"/documentation/scala/1629/string-interpolation" match {
case path"/documentation/${topic}/${id}/${_}" => println(s"$topic, $id")
case _ => ???
}
请注意,path
对象也可以定义 apply
方法,以便表现为常规插值器。