在准等式匹配中区分Tuple1

时间:2017-06-10 15:32:11

标签: scala macros tuples scala-macros scala-quasiquotes

假设我想要一个带有表达式的宏,如果它是一个元组文字,则返回arity。这样的东西适用于元组,但是对于其他所有内容都返回Some(1)而不是None

import scala.reflect.macros.blackbox.Context

class ArityMacros(val c: Context) {
  import c.universe._

  def arity[A: c.WeakTypeTag](a: c.Expr[A]): c.Tree = a.tree match {
    case q"(..$xs)" => q"_root_.scala.Some(${ xs.size })"
    case _ => q"_root_.scala.None"
  }
}

import scala.language.experimental.macros

def arity[A](a: A): Option[Int] = macro ArityMacros.arity[A]

我知道我可以这样做:

class ArityMacros(val c: Context) {
  import c.universe._

  def arity[A: c.WeakTypeTag](a: c.Expr[A]): c.Tree = a.tree match {
    case q"scala.Tuple1.apply[$_]($_)" => q"_root_.scala.Some(1)"
    case q"(..$xs)" if xs.size > 1     => q"_root_.scala.Some(${ xs.size })"
    case other                         => q"_root_.scala.None"
  }
}

但是觉得应该有更好的方法来区分Tuple1和非元组的情况(也许我过去曾经使用过它?)。

0 个答案:

没有答案