Описание, данное Adobe, не является ни точным, ни правильным, если честно, но оно проще и охватывает большинство случаев.
Вам следует попробовать следующее:
for (var key:* in dic) trace(getQualifiedClassName(key));//will give you 'String'
это поведение также верно для Array
и Object
.
Как правило: int
остается int
, а любой другой ключ преобразуется в его строковое представление (включая логические значения и значения с плавающей запятой, а также null
и undefined
).
Класс Dictionary
отличается тем, что он не преобразует непримитивные объекты в String
, а непосредственно использует их в качестве ключа. Их способ обработки всех других значений «унаследован» Object
, если хотите.
Как правило, Object
состоит из 2 хешей, один для строки и один для целочисленных ключей. И Dictionary
добавляет еще один хэш, возможно, просто используя адрес памяти объектов в качестве целочисленного ключа.
edit: Не совсем ответ на конкретный вопрос, но момент, который я хочу подробно объяснить в ответ на комментарий Трийнко:
Hacky? Вы имеете в виду, заставить его работать в
Кстати, он не предназначен для работы? Что ж...
так как он не предназначен для обработки
64-разрядные целые числа, конечно, это
хак. Но 64-битные это 64-битные, будь то
они интерпретируются как целое число или
с плавающей точкой.
Использование 64-битных чисел с плавающей точкой для представления 64-битных целых чисел уже является плохой идеей, поскольку семантически это совершенно неправильно (обычно можно ожидать, что проблемы возникнут из-за неправильного использования).
Но тогда использование их строкового представления в качестве ключа (что недопустимо, если вы используете float в качестве ключа) является простым самоубийством:
var f1:Number = 1000000000000003000000000.0;
var f2:Number = 1000000000000002000000000.0;
trace(f1 == f2);//false
trace(String(f1) == String(f2));//true ... kabooooom
Вам будет сложно определить, когда столкнутся 2 64-битные целые, поскольку обязательным условием является то, что строковое представление их значений, интерпретируемых как числа с плавающей запятой, должно быть одинаковым. Кроме того, разные версии проигрывателей могут иметь различное преобразование строк с плавающей запятой, как и альтернативные среды выполнения, такие как LightSpark . Я действительно не хотел бы полагаться на это. Это приводит к появлению ошибок, которые появляются из ниоткуда, когда данных достаточно, чтобы вызвать коллизию. И вам не понравится выслеживать их.
Кроме того, плавающие ключи работают хуже, так как они должны быть преобразованы в строки перед использованием для поиска хеша. Если вас действительно беспокоит размер, вам придется передавать данные как 64-битные целочисленные значения и преобразовывать их в шестнадцатеричную строку только на стороне флэш-памяти.
Тем не менее, я хотел бы отметить, что многие люди чрезвычайно довольны использованием XML или JSON, что приводит к гораздо худшим накладным расходам.
Пропускная способность и любые другие аппаратные ресурсы дешевы. Разработка дорогая. Вы должны писать свои приложения так, чтобы они были удобными в обслуживании и надежными, иначе в долгосрочной перспективе они будут стоить вам дороже.
Greetz
back2dos