Scala宏:检查符号/类型是否为元组

时间:2016-11-11 15:41:50

标签: scala scala-macros

在打字的黑盒宏(隐式素材工具)中,如何检查$(".MyModal").closeModal() Type是否为元组?有模式匹配的明显解决方案或类似的东西,但是我可以在任何地方找到Symbol方法吗?

到目前为止,我知道我可以这样做:

isTuple

是否有比上述怪物更明智的方法?

2 个答案:

答案 0 :(得分:1)

根据评论中的建议,只需简单匹配即可很好地处理。

def isTuple(tpe: Type): Boolean = {
  tpe.typeSymbol.fullName.startsWith("scala.Tuple")
}

答案 1 :(得分:0)

<击>

<击>
  import c.universe._
  import Flag._

  def tuple(i: Int) = {
    def list = (1 to i).toList
    c.typecheck(
      ExistentialTypeTree(
        tq"(..${list map (i => Ident(TypeName(s"_$i")))})", //just like (_,_, ...)
        list map (i =>
          TypeDef(Modifiers(DEFERRED | SYNTHETIC), TypeName(s"_$i"), List(), TypeBoundsTree(EmptyTree, EmptyTree))
          )
      )
    )
  }

// test

println(tuple(2).tpe <:< typeOf[(_, _)])//true 
println(tuple(3).tpe <:< typeOf[(_, _, _)])//true 

<击>

edit1:

def asTuple(tpe: Type): Boolean = {
  def allTuple = 1 to 22 map { i =>
    val typeNames = 1 to i map (e => TypeName(s"_$e"))
    tq"(..$typeNames) forSome {..${typeNames.map(e => q"type $e")} }"
  } map (t => c.typecheck(t).tpe)

  allTuple.exists(_ <:< tpe)
}

// test

println(asTuple(typeOf[Int])) // false 
println(asTuple(typeOf[(_, _)])) // true 
println(asTuple(typeOf[(_, _,_)])) // true