如何使用字符串作为关联数组键?

时间:2014-06-02 12:27:21

标签: associative-array autohotkey

我在AutoHotkey中编写一个简单的GUI,其中一个元素是能够将数字与按钮标签相关联:

Call:
{
book := {"Tel Maison": 8912, "Tel Mobile": 000000}
nr := book[%A_GuiControl%]
MsgBox %A_GuiControl% - number: %nr%
}

CapsLock::
Gui, Add, Button, gCall, Tel Maison
Gui, Add, Button, gCall, Tel Mobile
Gui, Show

运行此脚本时,按下按钮后会出现一条错误消息(以下变量名称包含非法字符:“Tel Maison”)指向

nr := book[%A_GuiControl%]

我认为这是由于标签名称中的空格字符。

Q1:是否可以使用带空格的哈希键?

我将脚本修改为

Call:
{
book := {"TelMaison": 8912, "TelMobile": 000000}
nr := book[%A_GuiControl%]
MsgBox %A_GuiControl% - number: %nr%
}

CapsLock::
Gui, Add, Button, gCall, TelMaison
Gui, Add, Button, gCall, TelMobile
Gui, Show

它现在运行但变量nr为空。

Q2:标签通过A_GuiControl作为字符串传递,对吧?如果是这样,为什么上面示例中的密钥不匹配?

我也尝试使用book := {TelMaison: 8912, TelMobile: 000000},但结果是相同的

1 个答案:

答案 0 :(得分:4)

这是AH​​K中表达式与字符串文字的典型示例,在某些情况下这可能很麻烦。为了将变量内容用作对象的键,只需将变量放在括号中,然后不要将它们用百分号(%包围:

nr := book[A_GuiControl]

这样,您可以很好地使用空格作为按钮名称。

book[%A_GuiControl%] 的问题是什么?
当您按键访问对象属性时,AHK需要硬编码字符串(例如book["Tel Maison"])或变量。由于我们不会将其传递给硬字符串,因此假设TelMaisonTel Maison是变量名称。访问Tel Maison将直接导致运行时错误,因为变量名称不能包含空格。 TelMaison是合法的,但不包含任何内容。基本上,我们使用空字符串作为键来访问对象(如book[""])。顺便说一下,这不是非法的,你实际上可以使用空字符串作为键,尽管我认为在大多数情况下这是不合理的。

为什么AHK会提供这种奇怪的语法?
在某些情况下,您可能希望将变量的内容依次用作变量名称。例如,请查看此示例:

TelMaison := 8912
TelMobile := 0
Gui, Add, Button, gCall, TelMaison
Gui, Add, Button, gCall, TelMobile
Gui, Show

Exit

Call:
    nr := %A_GuiControl%
    msgbox % nr
return

使用nr := %A_GuiControl%nr被赋予变量的值,其名称等于A_GuiControl的内容。我不会推荐这种模式,因为它非常容易出错并且设计很糟糕。