我的一个朋友正在敲他的头,因为这个Groovy代码。
让我们快速解释一下它的作用。
首先,我们创建一个空映射,然后定义一个作为字符串插值结果的键。 密钥将为"job-4"
。
然后,我们验证密钥是否已在地图上。 如果地图没有键,则将其添加为值1
,然后再次执行相同的操作,但是只是这次键将在地图上,并且什么都不会改变。 键"job-4"
的值应保持不变,即值1
。
让我告诉你一些事情,我们都是错的。 实际上,行println(cache[key])
将打印2
。
这太疯狂了!!! 因此,我们研究了其他语言,看看其中一种是否与Groovy的行为相同。
在Ruby中,我们这样做:
它按预期输出值1
!
在JavaScript中,我们这样做:
它按预期输出值1
!
在Elixir中,我们这样做:
它按预期输出值1
!
在Scala中,我们这样做:
它按预期输出值1
!
Groovy有什么问题!
问题来自Groovy管理动态类型和字符串插值的方式。
当Groovy进行字符串插值时,结果类型为GStringImpl
,这意味着比较不符合您的预期。 我们需要通过.toString()
将GStringImpl
强制为String
。
如果仅这样做:
def key = "job-${4}".toString()
一切都按预期开始。
结论
停止使用Groovy !!!
From: https://hackernoon.com/what-is-wrong-with-groovy-482b7064f591