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