3
鉴于宏的Option[T]
,我试图找到封闭式T
,从而给出类似斯卡拉宏:找到选项的封闭式
import scala.language.experimental.macros
import scala.reflect.macros.Context
def innerTypeImpl[T: c.WeakTypeTag](c: Context): c.Expr[String] = {
import c.universe._
val tpe = weakTypeOf[T]
val innerType = tpe.typeSymbol.asType.typeParams.head.name.decoded
c.Expr[String] { q" {$innerType} " }
}
def innerType[T] = macro innerTypeImpl[T]
通话innerType[Option[Int]]
将返回"Int"
(而现在它是返回"A"
,其对应于的Option
定义中使用的类型的参数)
T
可以不是Option
(该计划是使用tpe.typeSymbol.name.decoded == "Option"
,以确定是否T
是Option
),所以我不能够把任何边界上T
一定要调用'baseType'之前,模式匹配。如果有可能声明Option的无参数子类,模式匹配将虚假地崩溃。 –
@EugeneBurmako:你可以添加细节到你的答案。我无法尽可能好地创建一个关于scala宏的答案。 – senia
非常感谢您的阐述!我已经删除了我的答案,因为你的更友好。 –