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

时间:2017-01-18 00:17:24

标签: groovy groovyshell

我能够在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>

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

1 个答案:

答案 0 :(得分:1)

person.create(...)由Groovy翻译为getProperty('person').invokeMethod('create', ...),因为person在绑定中定义,creategetProperty('person')返回的对象上定义,所以它有效。

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

create(...)已翻译为invokeMethod('create', ...)。它失败,因为没有方法create,您无法通过绑定定义方法。