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
非常感謝您的闡述!我已經刪除了我的答案,因爲你的更友好。 –