Scala 使用宏生成通配符绑定模式

Scala 使用宏生成通配符绑定模式,scala,scala-macros,scala-quasiquotes,Scala,Scala Macros,Scala Quasiquotes,Scala允许在变量args上为unplyseq进行模式匹配: case class A(args: String*) A("a", "b", "c") match { case A(args @ _*) => args // Seq("a", "b", "c") } 我想用宏生成这样的模式。我该怎么做?尝试一件自然的事情是行不通的: scala> pq"x @ _*" <console>:11: error: illegal start of simple p

Scala允许在变量args上为
unplyseq
进行模式匹配:

case class A(args: String*)

A("a", "b", "c") match {
  case A(args @ _*) => args  // Seq("a", "b", "c")
}
我想用宏生成这样的模式。我该怎么做?尝试一件自然的事情是行不通的:

scala> pq"x @ _*"
<console>:11: error: illegal start of simple pattern
              pq"x @ _*"
                       ^

但是这太老套了,我不想这么做。

哦,好吧,我忘了
showRaw()

现在我将把它设为常量,并使用它来代替一些文字模式:

val wcard = Star(Ident(termNames.WILDCARD))

pq"$someIdent @ $wcard"

虽然有些尴尬,但考虑到quasiquotes不起作用,这似乎是最好的方法。

quasiquotes不支持
pq“x@*”
的原因在于模式语法的定义方式。通过产生式规则定义模式语法。可以看出,
.*
本身实际上不是一个有效的模式,它只在特殊的
模式
产生式规则中工作,该规则用于在提取器中对一系列模式进行建模

Quasiqueotes允许您通过各种插值器插入语法中的不同上下文。不幸的是,我们不能支持所有可能的上下文,因为这会导致API中有数百个插值器


最简单的解决方案就是在这里使用
Star(Ident(termNames.WILDCARD))

谢谢您的解释!
scala> showRaw(thingy)
res0: String = Star(Ident(termNames.WILDCARD))
val wcard = Star(Ident(termNames.WILDCARD))

pq"$someIdent @ $wcard"