如何将方法作为绑定变量传递给 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
并且您不能通过绑定定义方法。
我能够在 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
并且您不能通过绑定定义方法。