在打字的黑盒宏(隐式素材工具)中,如何检查$(".MyModal").closeModal()
或Type
是否为元组?有模式匹配的明显解决方案或类似的东西,但是我可以在任何地方找到Symbol
方法吗?
到目前为止,我知道我可以这样做:
isTuple
是否有比上述怪物更明智的方法?
答案 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