是否可以使用宏注释参数(以及如何获取它们)?

时间:2014-08-20 13:21:44

标签: scala scala-macros scala-macro-paradise

我有一些数据源需要在事务中进行包装操作,这有两种可能的结果:成功和失败。这种方法引入了很多样板代码。我想做的是这样的事情(对于失败也是如此(类似@txFailure)):

@txSuccess(dataSource)
def writeData(data: Data*) {
  dataSource.write(data)
}

其中@txSuccess是一个宏注释,处理后将导致:

def writeData(data: Data*) {
  val tx = dataSource.openTransaction()

  dataSource.write(data)

  tx.success()
  tx.close()
}

正如您所看到的,这种方法非常有用,因为在这个例子中,75%的代码可以被删除,因为它是样板文件。

这可能吗?如果是的话,你能给我一个正确方向吗?如果不是,为了达到这样的目的,你能推荐什么?

1 个答案:

答案 0 :(得分:0)

这绝对是可能的,但您不一定需要宏来完成任务。

这是一个简单的解决方案,它不使用宏

object DataOperation {
  def withTransation[T](dataSource: DataSource)(f: () => T): T = {
    val tx = dataSource.openTransation()
    f()
    tx.success()
    tx.close()
  }
}

并像

一样使用它
DataOperation.withTransation(dataSource) {
  dataSource.write(data)
}