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