2017-04-25 45 views
2

我希望做一個日誌註釋使用Scala的meta.Usage簡單:如何獲得一個帶有Scala元註釋的方法返回類型?

@Log 
def f1(a: Int) { 
    Future(a + 1) //result is a Future 
} 

// after parsed ====> 
def f1(a: Int) { 
    Future(a + 1).map{x => 
     println(x) 
     x 
    } 
} 

我如何檢查是否f1Future[ _ ]類型?由於
再說,我不想使用反射(性能爲代價)在Log註釋,我認爲方法的結果類型可以在編譯時決定。

+0

我不確定你在檢查什麼是@Log應該做的事情?爲什麼你不能使用像def f1 [A](a:Int):Future [A] = ???這樣的函數def,那麼當它不是未來 –

+0

@ LeMoN.xaH時,編譯時會失敗,謝謝你的建議。但我想要做的是將方法的結果作爲日誌信息打印出來。如果結果是「未來」,有意義的事情是印刷「未來」的價值而不是未來本身。 :-)因此,如果方法返回Future值,我使用宏做一個'map'操作。 – LoranceChen

+1

您可以爲同步和異步方法創建單獨的日誌註釋。 請考慮以下的實現,可能會覆蓋你的用例: https://github.com/eugengarkusha/macroLogging –

回答

1

這對於scalameta宏註釋是不可能的。宏註釋是句法的,因此它們無法訪問語義信息,例如樹的類型。

PS。我不知道如果宏註釋適合這個用例,你可以明確地寫出來的日誌語句像這樣的東西

def log[T](x: T): T = { println(x); x } 
Future(1).map(log) 

或更簡明的擴展方法

implicit class XtensionFuture[T](future: Future[T]) { 
    def logged: Future[T] = future.map(log) 
} 
Future(1).logged 

理想情況下,宏應作爲最後的手段,而不是僅僅爲了方便。

+0

您好,我想日誌用手包含了所有的重要手段的背景下info.Writing的任何地方HTTP請求的調用鏈'log.info/warning/error'在這種情況下非常無聊。scalameta會在後面的路線圖中公開語義信息嗎? – LoranceChen

+0

我剛剛發現[this](https://github.com/scalameta/scalameta/issues/604)。語義信息完成後可以訪問嗎? – LoranceChen

+0

即使在引入語義API之後,宏註釋仍可能保持句法。你是否仍然需要用我提出的'.logged'方法手工編寫log.info? Scala有很多工具可以對樣板進行抽象,宏確實是最後一道防線,如果可能的話應該避免。 –

相關問題