简而言之"${-> value - '/'}"
,它是一个完全惰性求值的 GString 值。
首先要澄清一些事情......"value"
是一个值为“值”的字符串。"$value"
是一个 GString 等于 value 作为 String 的值。所以如果 value 是"lol.com"
,那么这也将是 GString 的值。
这里需要注意两件事,GString 的值是惰性计算的,但用于此的对象不是。因此,如果 in "$value"
value 是具有 toString() 方法的类,则每次都会返回不同的 String,那么 GString 的 toString() 每次都会不同。当然,String 对象并非如此。因此,例如,如果您有类似的代码
def value=1
def gstring="$value"
value=2
assert gstring=="1"
那么 gstring 仍然是"2"
.
{->value}
现在是一个打开的块,它将返回值。评估是懒惰的,因此每次都是如此。所以在
def value=1
def closure={->value}
def a=closure()
value=2
def b=closure()
assert a==1
assert b==2
那么 a 将获得值 1,b 将获得值 2。类似方法调用的表达式closure()
将调用 open 块。
最后"${-> value - '/'}"
将被视为包含一个开放块的 GString。每次调用 toString() 方法时,GString 都会像往常一样评估打开的块,但这一次这将导致打开块的调用,从而再次评估值本身。结果是:
def value=1
def gstring="${-> value}"
value=2
assert gstring=="2"
如果将该示例与简单的 GString 版本进行比较,您将看到结果发生了变化。一个更复杂的例子:
def i=1
def gstring="${-> i++}"
assert gstring=="1"
assert i==2
assert gstring=="2"
assert i==3
assert gstring=="3"
assert i==4
如您所见,gstring 的 toString() 值在每次评估时都会发生变化,因为 open 块。