嗨,我有一个填充了运行时的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"
}

最佳答案

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

首先要澄清一些事情... "value"是具有值“值”的字符串。 "$value"是一个GString,等于value作为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都会评估打开的块,但这一次将导致调用打开的块,从而再次评估值本身。结果是:

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()值在每次评估时都会改变。

关于string - Groovy String评估运行时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29363110/

10-12 03:38