字符串插值器作为提取器

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

鉴于 n"p0${i0}p1" 去了 new StringContext("p0", "p1").n(i0),通过提供从 StringContext 到具有定义 unapplyunapplySeq 方法的类型属性 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 方法,以便表现为常规插值器。