Binding 用于绑定的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方法提供额外的类,而是使

我正在开发一个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方法提供额外的类,而是使用此功能增强对象

我一直在寻找一些物体的踪迹。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扩展呢?