Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 是否可能有宏注释参数(以及如何获取它们)?_Scala_Scala Macros_Scala Macro Paradise - Fatal编程技术网

Scala 是否可能有宏注释参数(以及如何获取它们)?

Scala 是否可能有宏注释参数(以及如何获取它们)?,scala,scala-macros,scala-macro-paradise,Scala,Scala Macros,Scala Macro Paradise,我有一些数据源需要在事务中包装操作,这有两种可能的结果:成功和失败。这种方法引入了相当多的样板代码。我想做的是这样的事情(对于失败也是如此(比如@txFailure可能)): 其中,@txSuccess是一个宏注释,处理后将产生以下结果: def writeData(data: Data*) { val tx = dataSource.openTransaction() dataSource.write(data) tx.success() tx.close() } 如您所

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

其中,
@txSuccess
是一个宏注释,处理后将产生以下结果:

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

  dataSource.write(data)

  tx.success()
  tx.close()
}
如您所见,这种方法非常有用,因为在本例中,75%的代码可以被删除,因为它是样板文件


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

这当然是可能的,但您不一定需要宏来完成任务

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

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

简短回答:是的,可以从
宏应用程序
中读取注释参数。我知道我在某个地方有一个老例子,我有空的时候会发布。@TravisBrown,我想我可以在几个小时内发布我的解决方案,所以请您稍等一下好吗?在我确信自己无法独立完成之前,我不希望受到监督解决方案的诱惑:)@TravisBrown,这是我的github回购协议:。你能帮我看看我做了些什么,也许能给我一些有用的评论吗?(除了我的TODO中已经有一个)这对我来说相当不错,尽管我会使用Quasikotes而不是
DefDef
之类的东西。另外,
c.prefix
让您比
c.macroApplication
更简洁一点-很抱歉我之前忘记了这一点。具体来说,
c.prefix.tree.tail
应该为您提供参数。这是我目前使用的。这是一个贷款模式的简单实现,我喜欢它,但我正在学习宏,我想写它(即使这只是为了好玩)。事实上,我几乎已经准备好自己发布我的工作解决方案了。我认为宏在这里是一种过度使用(代码的可读性和可维护性肯定会降低),无论如何,这是一种学习的好方法。
DataOperation.withTransation(dataSource) {
  dataSource.write(data)
}