假設我有這段代碼用于提取初始化變數的代碼:
def extractBodyImpl[T: Type](expr: Expr[T])(using Quotes) =
import quotes.reflect._
expr.asTerm.underlyingArgument match
case ident @ Ident(_) =>
ident.symbol.tree match
case ValDef(_,_,rhs) => println(rhs)
case DefDef(_,_,_,rhs) => println(rhs)
'{ () }
inline def extractBody[T](inline expr: T) = ${ extractBodyImpl('expr) }
當呼叫在同一范圍內宣告的變數時,它會按需要作業:
@main def hello() =
val x = 1
extractBody(x)
列印Some(Literal(Constant(1)))。
但是,在外部作用域的變數上,它列印None:
val x = 1
@main def hello() =
extractBody(x)
我怎樣才能讓它在第二種情況下作業?
uj5u.com熱心網友回復:
你不能用宏來做。接收引數的函式可能已從任何地方呼叫。靜態分析將如何訪問僅在運行時可用的資訊?唯一可靠的解決方案是強制用戶extractBody在定義值并將結果傳遞到一些結合了值及其來源的包裝器中后立即展開此宏。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/368223.html
