2012-06-11 5 views
3

Groovy에서 "$ -Strings"의 중첩 된 평가를 수행하는 방법이 있습니다.

def obj = {["name":"Whatever", "street":"ABC-Street", "zip":"22222"]} 
def fieldNames = ["name", "street", "zip"] 

fieldNames.each{ fieldname -> 
    def result = " ${{->"obj.${fieldname}"}}" //can't figure out how this should look like 
    println("Gimme the value "+result); 
} 

결과는 다음과 같아야합니다

Gimme the value Whatever 
Gimme the value ABC-Street 
Gimme the value 22222 

내 시도 (적절한 결과를 제공하지 않는 중이 문제를 해결하기 위해 예를 들어 단지 obj.street} 또는 전혀 컴파일되지 않습니다 나는 단순히 천국 '. . http://groovy.codehaus.org/Strings+and+GString 나는 그것이 가능해야한다 생각 해당 페이지 당신이 그것을 할 수있을 거라고 생각하게 중첩 된 사례가 없습니다

+0

https://stackoverflow.com/questions/46326920/how-to-use-groovy-template-engine-when-template-name-is-a-variable 변수의 진정한 사용 사례처럼 보입니다. – sorin

답변

4

무슨 일

: t은 그러나이 보는 것 같다 지금까지 전체 개념을 이해했다.?.3210

AFAIK 기본적으로 불가능합니다. ${} 내의 표현은 재평가되지 않습니다. 어쨌든 위험 할 것입니다. 무한히 깊게 만들고 스택을 날려 버리는 것은 정말 쉽습니다.

이 경우 어쨌든 필요하지 않습니다.

  • 만들기는 실제지도가 아닌 폐쇄, 그리고 필드 이름
def obj = [ "name": "Whatever", "street": "ABC-Street", "zip": "22222" ] 
def fieldNames = ["name", "street", "zip"] 

fieldNames.each { println "Gimme the value ${obj[it]}" } 

Gimme the value -> Whatever 
Gimme the value -> ABC-Street 
Gimme the value -> 22222 

  • 를 사용하여 노멀 맵 [] 액세스 편집 그것은 내가 잘못 이해 가능하고 obj고의적으로obj을지도 대신에 폐쇄 도구로 사용하고 있습니다. 이유를 이해하십시오.

  • +0

    아니, 당신의 대답은 내 필요에 완벽하게 어울립니다. 나는 단순히 해킹을 문자열에 너무 많이 사용하지 않고 쉬운 솔루션을 위해 부분적으로 사용하지 않습니다. 감사합니다 – user462982

    +0

    @ user462982 좋아요; 다행 당신을 위해 :) –

    +0

    이'fieldNames = "name"'어떻게 작동합니까? 나는 그 경우에'null' 결과를 얻는다. – user5359531

    관련 문제