Scala では、次の変数引数でパターン マッチングが可能ですunapplySeq
。
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 @ _*"
^
ただし、パターンから実際の型を抽出し、それを使用q
してパターンを再作成することは可能です。
scala> val q"??? match { case Hello($ident @ $thingy) => }" = q"??? match { case Hello(any @ _*) => }"
ident: reflect.runtime.universe.Name = any
thingy: reflect.runtime.universe.Tree = (_)*
scala> pq"$ident @ $thingy"
res1: reflect.runtime.universe.Bind = (any @ (_)*)
しかし、これはハックすぎるので、やりたくありません。