如何将方法作为绑定变量传递给 Groovy 的 ConfigSlurper?

How to pass a method as a Binding variable to Groovy's ConfigSlurper?

我能够在 Groovy 的 ConfigSlurper 上绑定对象,但不能绑定方法。那不可能吗?

这是一个例子

String conf = """

k1 = "v1"

environments{

    prod{
         person.create("prod.id1"){
            name = "prod.name1"
        }
    }

    dev {
        person.create("dev.id1"){
            name = "dev.name1"
        }

    }
}

environments{

    prod{
         create("prod.id2"){
            name = "prod.name2"
         }

    }

    dev {
        create("dev.id2"){
            name = "dev.name2"
        }


    }
}


"""

def parser = new ConfigSlurper("prod")
Person person1 = new Person()
Person person2 = new Person()
parser.setBinding([person: person1, // <-- SUCCESS
                   create: person2.&create]) // <-- NOT SUCCESS?

println parser.parse(conf)
println "person1=${person1.dump()}"
println "person2=${person2.dump()}"


class Person{

    String id
    String name

    public void create(String id, Closure c){
       this.id = id
       this.with(c)
    }


}

输出是

[k1:v1, create:prod.id2, create.name:prod.name2]
person1=<Person@409b0772 id=prod.id1 name=prod.name1>
person2=<Person@205ee81 id=null name=null>

请忽略示例中的任何设计缺陷。

person.create(...) 由 Groovy 翻译成 getProperty('person').invokeMethod('create', ...),它起作用是因为 person 是在绑定中定义的,而 create 是在返回的对象上定义的getProperty('person').

create.call(...) 有效,因为它被翻译成 getProperty('create').invokeMethod('call', ...)create 属性 是通过绑定定义的,属于 MethodClosure 类型,定义了 call 方法。

然而 create(...) 被翻译成 invokeMethod('create', ...)。它失败是因为没有方法 create 并且您不能通过绑定定义方法。