Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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宏:检查符号/类型是否为元组_Scala_Scala Macros - Fatal编程技术网

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")
}