Groovy String评估运行时

时间:2015-03-31 07:36:33

标签: string groovy closures gstring

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

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

所以当我 =" /www.stackoverflow.com" ,构造等于" www.stackoverflow.com"

但是当我做的时候

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

construct等于某个闭包名称。我想知道这是什么目的?为什么使用闭包,GString一切正常?为什么只使用闭合没有任何反应?

编辑: 该值从此方法调用更改。

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

1 个答案:

答案 0 :(得分:10)

简而言之,"${-> value - '/'}"是一个完全懒惰的评估GString的值。

首先澄清一些事情...... "value"是一个值为“value”的String。 "$value"是一个GString,它的值等于String的值。因此,如果value为"lol.com",那么这也是GString等于的值。

重要的是要注意这里有两件事,GString的值是懒惰的,但是用于此的对象不是。因此,如果"$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将评估open块,但这次这将导致open块的调用,从而再次计算值本身。结果是:

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

正如您所看到的,由于open块,每次计算时,gstring的toString() - 值都会发生变化。