2014-10-26 38 views
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 
) 

我們可以解決此通過簡單地重命名方法返回的東西明智的,但有任何其他方式來解決這個問題,而不需要明確的方法調用?

回答

2

如何從宏返回Dynamic的子類?然後你可以定義applyDynamicapplyDynamicNamed做你想做的。爲了獲得額外的編譯時安全性,您也可以將這些方法設爲宏。我剛剛檢查過,並且這與你想要的語法完全一致。

+0

這工作完美。唯一的缺點是需要在呼叫站點導入scala.language.dynamics。這可以通過使宏導入爲選項來避免:c.Expr(q「import scala.language.dynamics; new Dynamic {.. $ liftedApplyMethods}」) – Brendanator 2014-12-03 12:43:04

相關問題