2017-01-18 9 views
1

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

이 예에서는 어떤 디자인 결함을 무시하십시오 인 예입니다. person이 바인딩에 정의되어 있으며 creategetProperty('person')에 의해 반환 된 객체에 정의되어 있기 때문에

+1

'create.call() {}'을 (를) 사용해보십시오 – Dany

+0

달성하고자하는 것을 공유해 주시겠습니까? 아마도'ConfigSlurper'는 처음부터 그것을 할 올바른 방법이 아닙니다. – Dany

+0

@Dany Thanks,'.call()'이 작동합니다. 나는 DSL을 설계 할 계획이며 요구 사항 중 하나는 환경 특이성을 지원하는 것이다. 'create.call (..)'이 작동하는 동안,'call'을 사용할 필요가 없게하는 방법이 있습니까? – phani

답변

1

person.create(...)getProperty('person').invokeMethod('create', ...)에 그루비 번역, 그것은 작동합니다.

create.call(...)getProperty('create').invokeMethod('call', ...)으로 번역 되었기 때문에 작동합니다. create 속성은 바인딩을 통해 정의되며 call 메서드가 정의 된 MethodClosure 유형입니다.

그러나 create(...)invokeMethod('create', ...)으로 변환됩니다. create 메서드가 없기 때문에 실패하고 바인딩을 통해 메서드를 정의 할 수 없습니다.

+0

감사합니다. 다소 직교하지만 '번역 된'코드를 찾거나 참고 자료를 공유하는 방법을 알려 주실 수 있습니까? – phani

+0

참조가 없기 때문에 여전히 디버그 될 수 있으며 내부에서 어떤 일이 발생할지 모릅니다. – Dany