как да използвам низове като ключове за асоциативен масив?

Пиша прост GUI в 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