Binding 用于绑定的Groovy对象跟踪
我正在开发一个Groovy库,它使用简单的语法和丰富的事件处理程序提供变量绑定/同步。 首先,我的目标是运行以下功能:Binding 用于绑定的Groovy对象跟踪,binding,groovy,abstract-syntax-tree,Binding,Groovy,Abstract Syntax Tree,我正在开发一个Groovy库,它使用简单的语法和丰富的事件处理程序提供变量绑定/同步。 首先,我的目标是运行以下功能: def a = 1 def b = 1 def c = 1 a bind { b + c } assert a==2 & b==1 & c==1 b = 3 assert a==4 & b==3 & c==1 c = -1 assert a==2 & b==3 & c==-1 我希望避免使用JavaFX方法提供额外的类,而是使
def a = 1
def b = 1
def c = 1
a bind { b + c }
assert a==2 & b==1 & c==1
b = 3
assert a==4 & b==3 & c==1
c = -1
assert a==2 & b==3 & c==-1
我希望避免使用JavaFX方法提供额外的类,而是使用此功能增强对象
我一直在寻找一些物体的踪迹。Groovy没有重载赋值表达式的特性。
目前,我看到了大量AST转换的解决方案(也许dsld会有所帮助)
也许我错过了一些对象跟踪、事件或其他什么?我想您是在使用脚本编写代码。通过以下想法实现了您的愿望:
- 与其使用
,不如创建一个脚本将值绑定到键。绑定
类,该类同时表示变量
和变量值
李>名称
- 对
对象调用的每个方法都被委托给它的值李>变量
- 一个
类,它封装了对更新操作的引用和需要更新的侦听器
对象李>变量
- 一个
方法,用来更新监听器李>updateListeners()
- 一个
方法,它只是绕过变量对象的闭包。它几乎可以被删除并写成bind(closure)
a{b+c}
class Listener { Closure operation; Variable variable } class Variable implements GroovyInterceptable { String name; def value def invokeMethod(String method, args) { def var = args[0] var.class == Variable ? value."$method"(var.value) : value."$method"(var) } } Variable.metaClass.call = { Closure operation -> binding['listeners'] << new Listener(operation: operation, variable: delegate) updateListeners() } def bind(Closure operation) { operation } def updateListeners() { binding.listeners.each { it.variable.value = it.operation() } } void setProperty(String prop, value) { if (!binding.hasVariable('listeners')) binding['listeners'] = [] binding[prop] = new Variable(name: prop, value: value) updateListeners() }
类侦听器{闭包操作;变量} 类变量实现GroovyInterceptable{ 字符串名称;定义值 def invokeMethod(字符串方法,args){ def var=args[0] var.class==变量? 值“$method”(var.value):值“$method”(var) } } Variable.metaClass.call={闭包操作->
绑定['listeners']似乎我把你和我在示例中的无定义、无类变量声明搞混了。感谢你的想法,我学习了一些Groovy的新特性。但仍然存在如何跟踪局部变量的问题……我尝试过使用闭包,但又一次-只有绑定变量出现。Hm。所以你希望能够以简单的方式拦截变量创建非脚本groovy文件?如果可能的话,是的。否则,我似乎应该分析代码,找到类似bind的方法调用,并为参与绑定的变量注入额外的代码。当然,像在JavaFX中一样显式使用SmthProperty要容易得多,但我的目标是使事情尽可能简单,并且需要最少的重新分解如果库将添加到现有代码中。我怀疑groovy是否能够做到这一点。也许您可以使用元类拦截对象构造函数……也许您可以从变量注释中获益,但这就是java 8,我认为“如果库将添加到现有代码中”,那么groovy扩展呢?