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