Groovy 字符串评估运行时

Groovy String evaluation runtime

您好,我有一个运行时填充的字符串值,我想用它来构造另一个字符串。

static value= ''
static construct = "${-> value - '/'}"

所以当我 value = "/www.whosebug.com" 时,构造等于 "www.whosebug.com"

但是当我这样做时

static value= ''
static construct = {-> value - '/'}

construct 等于 某个闭包名称 。我想知道这样做的目的是什么?为什么用closure,GString就万事大吉了?为什么只使用闭包什么也没有发生?

已编辑: 此方法调用更改了值。

def someCoplmexMethod(){
   value="/www.whosebug.com"
}

简而言之,"${-> value - '/'}" 是一个完全延迟计算的 GString 值。

首先澄清一些事情..."value" 是一个字符串,其值为 "value"。 "$value" 是一个 GString 等于 value as String 的值。因此,如果值是 "lol.com",那么这也将是 GString 等于的值。

这里有两点需要注意,GString 的值是惰性计算的,但用于此的对象不是。因此,如果 "$value" 中的值是一个带有 toString() 方法的 class,那么每次都会 return 一个不同的字符串,那么 GString 的 toString() 每次都会不同。当然,对于 String 对象而言情况并非如此。因此,例如,如果您有像

这样的代码
def value=1
def gstring="$value"
value=2
assert gstring=="1"

那么 gstring 仍然是 "2".

{->value} 现在是一个打开的块,即 return 值。评估是懒惰的,因此每次都是如此。所以在

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 都会评估 open 块,但这一次将导致调用 open 块,从而再次评估 value 本身。结果是:

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() 值在每次求值时都会发生变化,因为打开了块。