Scala字符串内插器作为提取器

示例

也可以使用Scala的字符串插值功能来创建精细的提取器(模式匹配器),这可能是Scala宏的准引用API中最著名的一种。

考虑n"p0${i0}p1"到new StringContext("p0", "p1").n(i0),我们可以通过提供从隐式转换StringContext到具有n定义unapplyorunapplySeq方法的类型属性的类来启用提取器功能,这不足为奇。

例如,考虑以下提取器,该提取器通过从StringContext零件构造正则表达式来提取路径段。然后,我们可以将大部分繁重的工作委托给unapplySeq最终的scala.util.matching.Regex提供的方法:

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方法,以便也可以充当常规内插器。