как использовать строки в качестве ключей ассоциативного массива?

Я пишу простой графический интерфейс в AutoHotkey, одним из элементов является возможность связать число с меткой кнопки:

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%]

Я считаю, что это связано с пробелом в имени метки.

В1: нельзя ли использовать хеш-ключи с пробелом?

Я изменил скрипт на

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 пуста.

Вопрос 2. Метка передается через A_GuiControl в виде строки, верно? Если да, то почему нет совпадения с ключом в приведенном выше примере?

Я также пытался использовать book := {TelMaison: 8912, TelMobile: 000000}, но результат тот же


person WoJ    schedule 02.06.2014    source источник


Ответы (1)


Это типичный пример сравнения выражений со строковыми литералами в AHK, что в некоторых случаях может вызвать проблемы. Чтобы использовать содержимое переменной в качестве ключа для объекта, просто поместите переменную в скобки и не заключайте их в знаки процента (%):

nr := book[A_GuiControl]

Таким образом, вы можете очень хорошо использовать пробелы для имен кнопок.

В чем проблема book[%A_GuiControl%]?
AHK ожидает либо жестко запрограммированную строку (например, book["Tel Maison"]), либо переменную при доступе к свойству объекта по ключу. Поскольку мы не передаем ему жесткую строку, предполагается, что TelMaison или Tel 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. Я бы не рекомендовал этот шаблон, так как он очень подвержен ошибкам и просто плохой дизайн.

person MCL    schedule 02.06.2014