字串插值器作為提取器

也可以使用 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 方法,以便表現為常規插值器。