両方の例で、両方が同時に起こっています。
引用符Tree
を外すことは、どこかを別の構造に置き換えるプロセスですTree
(補間のように)。この例でints
は、 は正確には a ではありませんが、あたかもa であるかのように、 aを aにクォート解除できるTree
a が存在します(つまり、は、ここのリテラルを aに変換して置換できるようにする方法をコンパイラに指示します)。 .Liftable[List[T]]
List[T]
Tree
Tree
Liftable
List[Int]
Tree
ドキュメントを引用するには:
アンクォートスプライシングは、可変数の要素をアンクォートする方法です。
List
ここで、可変数の要素は、引用符を外したいの要素になります。を実行した場合、 の単一の引数としてq"f($ints)"
引用符を外すだけです。しかし、代わりに繰り返しパラメータを適用したいかもしれません。そのためにunquote splicingを使用します。ints
f
f
q"f(..$ints) // Using `..` means we get f(1, 2, 3) instead of f(List(1, 2, 3))
繰り返しますが、ドキュメントはそれを最もよく言っています。
unquotee の近くのドットは平坦化の程度を示し、スプライシング ランクとも呼ばれます。..$
は、引数が であるIterable[Tree]
と...$
想定し、 を想定してIterable[Iterable[Tree]]
います。
したがって、リフティングを使用すると、 aを であるかのようList[T]
にツリーに引用符で外すことができます。f(x)
Iterable[Tree]
List[T]
f
関連するさまざまな組み合わせを次に示します。
val listTree = q"scala.collection.immutable.List(1, 2, 3)"
val treeList = List(q"1", q"2", q"3")
val literalList = List(1, 2, 3)
scala> q"f($listTree)" // plain unquoting from another Tree
res6: reflect.runtime.universe.Tree = f(scala.collection.immutable.List(1, 2, 3))
scala> q"f($literalList)" // unquoting from lifting
res7: reflect.runtime.universe.Tree = f(scala.collection.immutable.List(1, 2, 3))
scala> q"f(..$treeList)" // plain unquote splicing
res8: reflect.runtime.universe.Tree = f(1, 2, 3)
scala> q"f(..$literalList)" // unquote splicing and lifting
res9: reflect.runtime.universe.Tree = f(1, 2, 3)