gpt4 book ai didi

grails - Groovy/Grails LinkedHashMap 行为异常

转载 作者:行者123 更新时间:2023-12-02 13:46:23 25 4
gpt4 key购买 nike

我在 LinkedHashMap 中遇到了一些令人困惑的行为
chalice 2.0.3。在 grails 控制台中运行以下脚本:

def m = ["smart-1":[stuff:'asdf']]
println m.getClass()

def p = [id:1]
println m."smart-$p.id"
println m["smart-$p.id"]
println m.get("smart-$p.id")

println m.'smart-1'
println m['smart-1']
println m.get('smart-1')

给出输出:
class java.util.LinkedHashMap
[stuff:asdf]
[stuff:asdf]
null
[stuff:asdf]
[stuff:asdf]
[stuff:asdf]

在集成测试中,我看到了相反的行为 - 我只能
使用 m.get(GStringImpl) 获取 HashMap 的内容(相反 m.get(String) )。

这种行为是预期的还是已知的?

最佳答案

第一:不要在你的哈希映射键中使用 GStrings。曾经。您几乎总是在检索项目时遇到问题,因为 GString is not a String (该页面上的红色框),并且没有相同的哈希值。相反,请使用以下选项之一:

def key = 'key'
['key': value]
[(key): value]
[("some $key".toString()): value]

这可确保您在使用字符串时始终获得结果。 (因此,对于查找,也始终使用字符串。)

我不是 100% 确定您为什么会看到奇怪的行为,但我有一个可靠的猜测。 get() method 是一个 Java 方法,而数组样式(可能还有属性样式)的查找是使用 getAt() 实现的。 ,这是一种 Groovy (GDK) 方法。我的猜测是 Groovy 方法知道 GStrings,并且默默地处理转换以确保您不会被绊倒。

最简单的解决方案是始终使用 getAt() ,不是 get :
def m = ['smart-1':[stuff:'asdf']]
println m.getClass()

def p = [id:1]
println m."smart-$p.id"
println m["smart-$p.id"]
println m.getAt("smart-$p.id")

println m.'smart-1'
println m['smart-1']
println m.getAt('smart-1')

哪个工作正常。

更好的解决方案是确保在查找值时使用字符串,如下所示:
println m.get("smart-$p.id".toString())

这也有效。我比较喜欢这个方法,因为直接调用这个方法的时候,你的key是String就更清楚了。在使用数组样式或属性样式访问器时,我仍然会使用普通的 GString,因为这是标准的 Groovy 语法。

In an integration test, I'm seeing the opposite behaviour - I can only get the content of the HashMap using m.get(GStringImpl) (as opposed m.get(String)).



这很可能是因为您的哈希图中的键是 GString。

如果 GString 没有任何变量,Groovy 编译器会默默地将其转换为 String 字面量(更好的性能),这就是为什么上面的示例实际上使用 String 作为键,但查找使用的是 GString。

例如
"Hello $name" -> GString('Hello $name')
"Hello Bob" -> 'Hello Bob'

最后一个想法:只要你在 groovy,就不要使用 get() ,因为 Groovy 提供了更干净的 []和属性语法。

关于grails - Groovy/Grails LinkedHashMap 行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10528322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com