2

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

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

因此,当我重视= "/www.stackoverflow.com" 时,构造等于 "www.stackoverflow.com "

但是当我这样做时

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

construct等于某个闭包名称。我想知道这样做的目的是什么?为什么使用闭包,GString 一切正常?为什么只使用闭包什么都没有发生?

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

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

1 回答 1

10

简而言之"${-> 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 块。

于 2015-03-31T08:58:55.517 回答