【问题标题】:Is it possible to have macro annotation parameters (and how to get them)?是否可以有宏注释参数(以及如何获取它们)?
【发布时间】:2014-08-20 22:55:59
【问题描述】:

我有一些数据源需要在事务中包装操作,这有两种可能的结果:成功和失败。这种方法引入了相当多的样板代码。我想做的是这样的(失败也是如此(可能是@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% 的代码。

这可能吗?如果是的话,你能给我一个正确的方向吗?如果没有,您可以推荐什么来实现这样的目标?

【问题讨论】:

  • 简短回答:是的,可以从macroApplication 中读取注释参数。我知道我在某个地方有一个老例子,我会在有时间的时候发布。
  • @TravisBrown,我想我可以在几个小时内发布我的解决方案,所以请稍等一下吗?在确定自己无法完成之前,我不希望自己监督解决方案 :)
  • @TravisBrown,这是我的 github 仓库:github.com/cdshines/txMacro。你能不能好心看看我做了什么,也许可以为我提供一些有用的 cmets/remarks? (除了我已经在我的 TODO 中的那个)
  • 这对我来说看起来不错,尽管我会使用准引号而不是 DefDef 的东西。另外c.prefix 让我们比c.macroApplication 更简洁一点——抱歉我之前忘记了。
  • 具体来说,c.prefix.tree.tail 应该给你参数。

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


【解决方案1】:

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

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

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)
}

【讨论】:

  • 这是我目前使用的。这是一个贷款模式的简单实现,我喜欢它,但我正在学习宏,我想写它(即使这只是为了好玩)。事实上,我几乎已经准备好自己发布我的工作解决方案了。
  • @cdshines 我明白了。我认为宏在这里是多余的(代码的可读性和可维护性肯定会降低),无论如何这是一种学习的好方法。
猜你喜欢
  • 2017-12-05
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
相关资源
最近更新 更多