Dictionary 具有变量属性和字符串插值的Groovy映射问题

Dictionary 具有变量属性和字符串插值的Groovy映射问题,dictionary,groovy,interpolation,Dictionary,Groovy,Interpolation,很长一段时间以来,我一直在很好地导航地图结构。然而,出于某种原因,这个问题的根源我没有意识到。我也试过括号符号,运气不好 为什么最终输出(null)不返回“[serverinfo:[listenPort:19001]” 如果我用简单的“服务”替换“$instanceName”的两个实例,它就会工作 String instanceName = "Services" Map serverNode = [ instances:[ "$instanceName":[

很长一段时间以来,我一直在很好地导航地图结构。然而,出于某种原因,这个问题的根源我没有意识到。我也试过括号符号,运气不好

为什么最终输出(null)不返回“[serverinfo:[listenPort:19001]”

如果我用简单的“服务”替换“$instanceName”的两个实例,它就会工作

String instanceName = "Services"
Map serverNode = [
    instances:[
        "$instanceName":[
            serverinfo:[
                listenPort:19001
            ]
        ]
    ]
]

println "$instanceName"
println serverNode.instances
println serverNode.instances."$instanceName"

//output 
Services
[Services:[serverinfo:[listenPort:19001]]]
null
“$instanceName”
的类型是
GStringImpl
,而不是
String
。这是一个常见的错误(而且很难找到!)


正如@tim_yates在comment中所述,如果插入的字符串像本例中一样简单(即“${property}”),那么可以使用
(property)
语法:Groovy将属性的值作为键,而不是单词“property”

(instanceName):[
是的,你是对的,这比我的回答要好得多:-)我的回答更严格,因为这个关于地图中gstring的问题(但结果是..丑陋)完全同意,他们提到了插值,所以我猜他们的实际代码更复杂;-)非常感谢,这大大提高了我处理地图的能力,并回答了一个特别令人沮丧的小细节。
def serverNode = [
    instances:[
        ("$instanceName" as String):[
            serverinfo:[
                listenPort:19001
            ]
        ]
    ]
]