【发布时间】:2017-04-07 11:44:57
【问题描述】:
我试图理解为什么在下面的 sn-p 中,如果 GString 是在闭包内创建的,它会被很好地评估,但如果我尝试在外部创建字符串并尝试在闭包内对其进行评估,则会抛出异常:
map1 = ['foo': 1, 'bar': 2]
map2 = ['foo': 3, 'bar': 4]
dynamicallyGeneratedString = "key1: ${->key1}, val1: ${->value1}, key2: ${->key2}, val2: ${->value2}"
map1.each { key1, value1 ->
map2.each { key2, value2 ->
println "key1: ${->key1}, val1: ${->value1}, key2: ${->key2}, val2: ${->value2}" // works as expected
// println dynamicallyGeneratedString // throws MissingPropertyException
}
}
两种情况下的期望输出都是:
key1: foo, val1: 1, key2: foo, val2: 3
key1: foo, val1: 1, key2: bar, val2: 4
key1: bar, val1: 2, key2: foo, val2: 3
key1: bar, val1: 2, key2: bar, val2: 4
我的目标是根据其他一些条件动态生成一个字符串,然后在遍历地图时懒惰地评估其内容。
这是一种有效的方法吗?
【问题讨论】:
-
不确定是否可行...您可以使用模板引擎吗?为什么字符串的定义需要远离它的用法?
-
只是因为我使用了一些 if 和 else 来组装字符串,并且我不知何故认为只创建一次会更容易,而不是测试每次迭代的条件。但也许我不应该考虑在这一步进行优化?!
-
听起来像是模板的案例?
标签: groovy closures lazy-evaluation gstring