Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 拟单叶匹配中Tuple1的判别_Scala_Macros_Tuples_Scala Macros_Scala Quasiquotes - Fatal编程技术网

Scala 拟单叶匹配中Tuple1的判别

Scala 拟单叶匹配中Tuple1的判别,scala,macros,tuples,scala-macros,scala-quasiquotes,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 {

假设我想要一个宏,它接受一个表达式,如果它是元组文字,则返回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
和非tuplecase(也许我以前用过它?)。

没有完美的方法
casex@q“(..$xs)”如果x.tpe 1