2017-01-18 2 views
1

Мне удалось привязать объект к ConfigSlurper Groovy, но не к методу. Разве это невозможно?Как передать метод в качестве переменной привязки в ConfigSlurper Groovy?

Вот пример

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=<[email protected] id=prod.id1 name=prod.name1> 
person2=<[email protected] id=null name=null> 

Игнорируйте любые конструктивные недостатки в примере.

+1

Попробуйте использовать 'create.call() {}' – Dany

+0

Не могли бы вы поделиться тем, чего хотите достичь? Вероятно, 'ConfigSlurper' не является правильным способом сделать это в первую очередь – Dany

+0

@Dany Спасибо,' .call() 'работает. Я планирую разработать DSL, и одним из требований является поддержка специфики среды. В то время как 'create.call (..)' работает, есть ли способ устранить необходимость использования 'call'? – phani

ответ

1

person.create(...) переведена на Groovy в getProperty('person').invokeMethod('create', ...), она работает с person определяется в связывании и create определяется на объект, возвращаемый getProperty('person').

create.call(...) работает, потому что он переведен на getProperty('create').invokeMethod('call', ...). create свойство определяется посредством привязки и имеет тип MethodClosure, который имеет метод call.

Однако create(...) переведен на invokeMethod('create', ...). Он терпит неудачу, потому что нет метода create, и вы не можете определять методы посредством привязки.

+0

Спасибо. Это несколько ортогонально, но вы могли бы также сообщить мне, как узнать о «переведенном» коде или поделиться некоторыми ссылками? – phani

+0

Боюсь, что ссылок нет, все же вы можете отлаживать и что происходит внутри – Dany

Смежные вопросы