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() 值在每次求值时都会发生变化,因为打开了块。
您好,我有一个运行时填充的字符串值,我想用它来构造另一个字符串。
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() 值在每次求值时都会发生变化,因为打开了块。