Scala宏:检查符号/类型是否为元组
在类型化黑盒宏(隐式物化器)中,如何检查Scala宏:检查符号/类型是否为元组,scala,scala-macros,Scala,Scala Macros,在类型化黑盒宏(隐式物化器)中,如何检查类型或符号是否为元组?有明显的模式匹配或类似的解决方案,但是否有一种我在任何地方都能找到的isTuple方法 到目前为止,我知道我可以做到: def typed[A : c.WeakTypeTag]: Symbol = weakTypeOf[A].typeSymbol object TupleSymbols { val tuple2 = typed[(_, _)] val tuple3 = typed[(_, _, _)] // ... an
类型
或符号
是否为元组?有明显的模式匹配或类似的解决方案,但是否有一种我在任何地方都能找到的isTuple
方法
到目前为止,我知道我可以做到:
def typed[A : c.WeakTypeTag]: Symbol = weakTypeOf[A].typeSymbol
object TupleSymbols {
val tuple2 = typed[(_, _)]
val tuple3 = typed[(_, _, _)]
// ... and so on
}
有没有比上述怪物更理智的方法?
//试验
println(tuple(2).tpe <:< typeOf[(_, _)])//true
println(tuple(3).tpe <:< typeOf[(_, _, _)])//true
println(asTuple(typeOf[Int])) // false
println(asTuple(typeOf[(_, _)])) // true
println(asTuple(typeOf[(_, _,_)])) // true
根据评论中的建议,这可以通过简单的匹配很好地处理
def isTuple(tpe: Type): Boolean = {
tpe.typeSymbol.fullName.startsWith("scala.Tuple")
}
检查名称是否匹配scala.Tuple\d*?@AlexeyRomanov这是最好的吗?感觉脆弱但可行。我当然更喜欢它,而不是定义
tuple2
等。但我不知道是否有更好的选择。谢谢,但我不想构造tuple类型,或者使用AST,Quasikotes更容易。我不确定您是否理解我的问题,我希望在不手动定义所有元组类型的情况下检查任意类型是否为元组。
println(asTuple(typeOf[Int])) // false
println(asTuple(typeOf[(_, _)])) // true
println(asTuple(typeOf[(_, _,_)])) // true
def isTuple(tpe: Type): Boolean = {
tpe.typeSymbol.fullName.startsWith("scala.Tuple")
}