我想編寫一個宏,其中返回類型取決於參數。簡單示例:宏返回類型取決於參數
def fun[T](methodName: String) = macro funImpl[T]
def funImpl[T: WeakTypeTag](c: Context)(methodName: c.Expr[String]): /* c.Expr[T => return type of T.methodName] */ = {
// return x => x.methodName
}
很明顯,註釋退貨類型funImpl
是非法的。我試着簡單地返回一個Tree
,但是這會產生一個錯誤:
[error] macro implementation has wrong shape:
[error] required: (c: scala.reflect.macros.Context): c.Expr[Any]
[error] found : (context: scala.reflect.macros.Context): context.Tree
[error] type mismatch for return type: c.universe.Tree does not conform to c.Expr[Any]
[error] def fun[T] = macro PrivateMethodMacro.funImpl[T]
[error] ^
是否有可能寫出這樣的宏?很顯然,如果返回類型被作爲另一個類型參數傳遞,就像在Is it possible to write a scala macro whose returntype depends on argument?的回答中一樣,但這不是我想要的。
在2.11中,'警告:宏定義必須明確指定返回類型(推斷任何來自宏的impl的c.Expr [Any]已被棄用,並將在2.12中停止工作)' –
您是否正在使用上下文'白盒'套餐? –
當然。未分化的上下文更被棄用。 –