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