我正在开发一个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我希望避免使用Java FX方法来提供额外的类,而是使用此功能来增强对象。
我被困在寻找一些物体的追踪。Groovy没有重载赋值表达式。目前,我在繁重的AST转换中看到了解决方案(也许dsld可能会有所帮助)。
也许有一些对象跟踪,事件或其他什么,我错过了?
发布于 2013-04-01 09:27:07
我假设您正在使用脚本编写代码。用下面的想法做了你想做的事情:
与使用Script.binding将值绑定到键相比,最好创建一个Variable类来表示value,并将在Variable对象上调用的变量name;
Listener类,它封装了对更新操作和Variable对象的引用;
updateListeners()方法,用于更新侦听器;
bind(closure)方法只是绕过了变量对象的闭包。它很可能会被删除并写成a { b + c };类侦听器{闭包操作;变量变量}类变量实现GroovyInterceptable { String name;def value def invokeMethod(String method,args) { def var = args var.class ==变量?值。“$method”(var.value):值。“$method”(Var)}} Variable.metaClass.call ={ Closure operation -> binding‘Listener’<<新监听器(操作:操作,变量:委托) updateListeners() } def bind(闭包操作){var.value} def updateListeners() { binding.listeners.each { it.variable.value = it.operation() }} setProperty(String prop,值){ if (!binding.hasVariable('listeners'))绑定‘listeners’= [] bindingprop =新变量(名称:属性,值:值) updateListeners() }
你的测试就像个护身符。
https://stackoverflow.com/questions/15735247
复制相似问题