Ключи массива Assoicative, которые разрешают в числа, не возвращают результатов - PullRequest
0 голосов
/ 24 июня 2018

Если я перебираю массив строк и использую каждую строку в качестве ключа для ассоциативного массива, ключ, являющийся строковым представлением числа, не может "найти" соответствующее ему значение:

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» распознается как ключ, и его значения возвращаются правильно. В противном случае, если я удалю кавычки из «777»«В KeyArray и AssocArray оба цикла находят правильные значения.

Теперь вопрос:
Как правильно использовать строковое представление числа в качестве ключа для ассоциативного массива?

Большое спасибо!

1 Ответ

0 голосов
/ 25 июня 2018

Это связано с внутренним приведением типов и кэшированием чисел.

Другими словами, строка "777" преобразуется в число 777 в AssocArray[aKey], так как любое выражение (aKey в этом случае) создает число, если вычисленный результат находится в числовой форме, если явносказал иначе.

Обходной путь:

aValue := AssocArray[aKey ""]

С вышеупомянутой однострочной модификацией ваш первый кусок кода был протестирован для работы.


Редактировать :

Что касается вопроса в комментарии ниже, вот несколько ссылок:

Кэширование
типПринуждение, иначе говоря неявное преобразование типов

Обратите внимание, однако, что «неявный» и «явный» являются относительными терминами в контексте приведения.

...