3
在我們的圖書館,我們有規定,像這樣的宏:Scala bug SI-7914有沒有解決方法 - 從Scala宏返回一個應用方法?
def extractNamed[A]: Any = macro NamedExtractSyntax.extractNamedImpl[A]
本宏使用它的類型簽名來返回apply
方法,其參數匹配其輸入,把案件類的apply
方法。
的想法是,這使得我們的圖書館的用戶使用Scala的命名參數,像這樣:
lazy val fruitExtractor = extractNamed[Fruit](
name = FruitTable.name,
juiciness = FruitTable.juiciness
)
然而,這似乎並沒有工作 - 它不是在編譯時返回error: Any does not take parameters
。
看起來這是由SI-7914,因爲它如果用戶明確要求申請工作,即引起:
lazy val fruitExtractor = extractNamed[Fruit].apply(
name = FruitTable.name,
juiciness = FruitTable.juiciness
)
我們可以解決此通過簡單地重命名方法返回的東西明智的,但有任何其他方式來解決這個問題,而不需要明確的方法調用?
這工作完美。唯一的缺點是需要在呼叫站點導入scala.language.dynamics。這可以通過使宏導入爲選項來避免:c.Expr(q「import scala.language.dynamics; new Dynamic {.. $ liftedApplyMethods}」) – Brendanator 2014-12-03 12:43:04