2

我想做一个使用scala meta.Usage简单的日志注释:

@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注释中使用反射(性能成本),我认为方法结果类型可以在编译时确定。

4

1 回答 1

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

理想情况下,宏应该作为最后的手段使用,而不仅仅是为了方便。

于 2017-04-25T09:42:11.407 回答