首页 > 解决方案 > 解析为数字的关联数组键不返回任何结果

问题描述

如果我遍历字符串数组,并将每个字符串用作关联数组的键,则作为数字的字符串表示的键无法“找到”其关联值:

KeyArray := Array("AAA", "777")
AssocArray := {"AAA":{"Item1":"Item1Value", "Item2":"Item2Value"} 
              ,"777":{"Item1":"Item1Value", "Item2":"Item2Value"}}

Loop % KeyArray.Length() {
    aKey := KeyArray[A_Index]
    aValue := AssocArray[aKey]
    sResult := aKey . ": " . aValue["Item1"] . "`t" . aValue["Item2"]
    ToolTip, % sResult
    OutputDebug % "[AHK] sResult: " . sResult . " " 
    Sleep 5000
}

但是,如果我使用 For 循环来迭代键:

For aKey, aValue In AssocArray {
    sResult := aKey . ": " . aValue["Item1"] . "`t" . aValue["Item2"]
    ToolTip, % sResult
    OutputDebug % "[AHK] sResult: " . sResult . " " 
    Sleep 5000
}

然后“777”被识别为一个键,并且它的值被正确返回或者,如果我从 KeyArray 和 AssocArray 中的“777”中删除引号,那么两个循环都会找到正确的值。

现在问题来了:
如何正确使用数字的字符串表示形式作为关联数组的键?

非常感谢!

标签: autohotkeyassociative-array

解决方案


这与内部类型强制和数字缓存有关。

换句话说,字符串 "777" 被强制转换为数字 777 in AssocArray[aKey],因为如果评估结果是数字形式,任何表达式(aKey在这种情况下)都会产生一个数字,除非另有明确说明。

一种解决方法:

aValue := AssocArray[aKey ""]

通过上面的单行修改,您的第一段代码已经测试可以工作。


编辑

关于下面评论中的问题,这里有一些参考资料:

缓存
类型强制又名隐式类型转换

但是请注意,“隐式”和“显式”是强制上下文中的相对术语


推荐阅读