nme и Dictionary

Попробовал скомпилировать пару флеш-класов с помощью nme+hxcpp под neko(для начала) и был слегка обескуражен следующим (не считая кучи других проблем):
Нет ни Dictionary, ни TypedDictionary!
На сайте http://www.haxenme.org/ гуглится только неадекват "вам это не нужно, используйте Hash" в ответах бедолагам на аналогичные вопросы.

Собственно вопроса 2:
- Может я чего упустил и словарь существует?
- Если же аналога действительно нет, как выкручиваться?

Допустим есть мой личный класс, который я хочу использовать как ключ. Здесь все понятно: делаем в классе строковое поле с уникальным значением для каждого объекта класса и используем как ключ в Hash.

Но как быть с функциями? Там зацепиться не за что кроме ссылки. А именно к адресу ссылки мы доступа не имеем. Оборачивать в объект со строковым полем и таскать везде это обёрнутое недоразумение?
Поделитесь соображениями пожалуйста. Тупой перебор в моём случае непомерно затратен.

ds?

я возможно чего-то недопонимаю, но неужели и в библиотеке ds от polygonal не нашлось ничего подходящего для ваших нужд? вот это решение, например: http://lab.polygonal.de/?p=1325

По всей

По всей видимости дело только в красивости синтаксиса.

Замена TypedDictionary

Замена TypedDictionary для cpp существует. Ее сделал Джошуа Граник. Найти можно в библиотеке actuate (haxelib install actuate) в файле: в файле Actuate.hx (примерно с 550 строки - класс ObjectHash).
Сорри, что так поздно, но надеюсь, что поможет :)

О! Сейчас глянем

О! Сейчас глянем

Они тут для neko создают поля на объекте. Но для функций такой подход не прокатывает :(. Интересно в c++ для функций это работает или нет.

Я пользовался

Я пользовался этим классом (правда не так интенсивно) и ошибок не возникало

Аналог и не

Аналог и не нужен. Необходимость возникает лишь от нарушений в ооп архитектуре. Зачем для объекта хранить доп. св-во ?

ага, хеши тоже

ага, хеши тоже идиоты придумали для решения проблем, которые никогда не возникают.

Я пишу вот о

Я пишу вот о чем. Под flash сейчас пишут очень много малоопытных программистов у которых часто возникает задача юзать хеш. Так как эти программисты пока еще не знают шаблонов проектирования, то у них и возникает в этом нужда. Adobe это выгодно как и новичкам. Невыгодно это только в крупных командных проектах, где такой подход будет неприемлем. Haxe все таки не для начинающих писать под flash, хотя я сам и начинал с него(но опять же, криворукости много было и сейчас не могу сказать что шибко профи). Но в своей практике я не втречал случая где dictionary необходим и без него не обойтись. Вы все еще можете пожертвовать кросспрлатформенностью и заюзать его через extern class Dictinary implements ArrayAccess. Как-то так.

Значит люди,

Значит люди, которые пишут компиляторы или интерпретаторы (а в них используются хеши на полную, по крайней мере если он на C пишется) - малоопытные программисты все сплошняком.
Да что там, сам Николя Канасье - нуб, потому что заюзал хеши в своем hscript и в других либах.

Не, часто лучше без хеша засунуть дополнительное поле в сам объект, чтобы не мучаться с поддержанием адекватного состояния этой структуры - в других ситуациях это невозможно либо приводит к сильной связности. Но так про любой подход можно сказать.

Давайте не

Давайте не спорить. Подумаем вместе. Хеш реализуется довольно просто в виде примитивного класса который хранит в себе массив ключей и массив значений. При обращении по строковому ключу наш класс ищет ищет его сперва в первом массиве(массиве ключей), потом узнает его индекс и возвращает значение по найденному индексу во втором массиве. В компиляторы это было введено лишь для упрощения разработки приложения, но это не означает что без этого никак.

Совсем не обязательно для этого доп. поле в объекте держать если можно пользоваться те что каждый объект имеет ссылку на себя. И это и есть показатель уникальности объекта. В приведенной выше схеме достаточно найти это ссылку в массиве ключей.

Цитата: Хеш

Цитата:
Хеш реализуется довольно просто в виде примитивного класса который хранит в себе массив ключей и массив значений. При обращении по строковому ключу наш класс ищет ищет его сперва в первом массиве(массиве ключей), потом узнает его индекс и возвращает значение по найденному индексу во втором массиве

Хех, если бы он искал все в 2-х массивах, он бы так быстро не работал. И скорость бы зависела сильно от количества элементов. Он работает несколько по-другому (хотя могут реализовать и на каком-нибудь дереве, тогда доступ будет log(n)).

Проблема в том, что для реализации этой схемы объекту надо сопоставить строковый или числовой ключ. А значит надо или поле создать в объекте или обернуть его объектом с ключём. Т.к. в neko не ясно как родить ключ для функции - единственное приходящее на ум решение это обернуть ее и таскать везде обертку. Ну не искать же в массиве индекс при каждом обращении - это непомерно затратно!

Ну началось,

Ну началось, давайте все под себя прогибать. :) Но посмеялся я от души, спасибо. Вы по картинкам в википедии не заметили что у них по сути те же два массива, только соединенные в один, вместо var keys:Array и var vals:Array используется var hash:Array<{key:Dynamic,val:T}>, однако, если вы не знали, обращение к массиву по числовому ключу(этап 2 моего алгоритма, описанного выше) работает константное время. То есть вся сложность алгоритма заключается лишь в скорости поиска ключа, хоть в первом массиве, хоть в обобщенном. Вам предложили вариант реализации того что вам нужно. Если вас не устраивает - пишите свой. Больше я вам не буду помогать в этом вопросе.

Я тоже, не вижу

Я тоже, не вижу смысла продолжать. Мы как буд-то не можем на одном языке говорить. Да и с подходами к хешам/словарям на nme все понятно

Не, если бы вы рядом сидели - мы бы пообщались по хешам и я бы понял что вы имеете в виду. А так изводить тоны электронной бумаги с ожиданием ответа в несколько часов - увольте.

Без проблем,

Без проблем, возможно, если будет время, скину пример чтоб было понятней.

dictionary

Так. Давайте разберемся в вопросе.
1. В haxe пока еще не реализовали нормально(лишь частично) ArrayAccess.(возможно будет в 3-й версии). Так что пока в nme это работает только очень ограничено как и в jeash.(ByteArray тому пример).
2. У разработчиков пока не так много времени чтоб клонировать все flash-классы. Однако, если вы реализуете то чего вам не хватает и создадите тикет, то его обязательно рассмотрят. Я как-то беседовал с joshua granick он нормально реагировал.
3. nme это все же игровой фреймворк и главная его задача - многоплатформенность + стандартность.
4. Необходимость в использовании Dictionary возникает при неправильно продуманной архитектере. Допустим для объекта надо хранить какое-то доп. значение, почему бы не вынести это доп. значение в сам объект ? Или в крайнем случае можно обертку сделать над каким-то классом(паттернов много). Я сталкивался сам с подобной задачей, однако все решалось более правильной обдуманностью архитектуры.

Допустим что все таки ArrayAccess будет полноценно реализован в haxe. И вы за хотте обращаться к значению в массиве с помощью какого-то объекта в качестве ключа. Как это организовать ? Правильно, ввести индивидуальный строковый хеш для каждого уникального объекта который и будет применяться в качестве ключа. Не проще ли вам написать свои классы для этого ? Типа потомок от Hash с методами get,set,add и put. Вы также можете создать тикет в проекте Haxe на гуглокоде и в проекте nme.

Надеюсь, я достаточно написал даже алгоритм работы в вкратце изложил.

Т.е. строчить

Т.е. строчить обертки и таскать их по всему коду - это хорошая архитектура,
а использовать объекты в качестве ключей напрямую - плохая?

Я, конечно, подозреваю, что взять хеш от произвольного объекта невозможно на всех платформах (мне, например, нужен хеш от функции),
потому и не реализовали.

Чтож, значит придется как в C# лепить: new Delegate(myMethod). Только по сравнению с C#, нужно будет сохранять ссылку на этот Delegate :(
(C# каким-то чудом распознавал одинаковые функции, обернутые разными обертками при добавлении в event)

Напрягает здесь усложнение кода из-за хранение этих ссылок и создание лишних объекто. Но раз у Вас проблем не возникало, может и у меня получится обойтись без этого Dictionary.

когда я пытался

когда я пытался портировать AsWing на nme, я тоже уперся в отсутствие dictionnary
на самом деле, проблема в существовании замкнутого круга из трех несостыковок
1) некоторое количество готовых флеш-решений используют dictionnary
2) в nme не реализован dictionnary в принципе (и, вероятно, возможностью эффективной реализации там и не пахнет)
3) в haXe нет хешей от произвольного объекта - быстро переписать код из п.1 не получается, даже при наличии исходников

что реально нужно с этим делать - непонятно

Всё-таки нет,

Значит всё-таки аналога нет, спасибо

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <blockcode> <dd>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>.

Подробнее о форматировании

CAPTCHA
Этот вопрос помогает предотвратить автоматический спам
Image CAPTCHA
Enter the characters shown in the image without spaces, also respect upper and lower case.
To prevent automated spam submissions leave this field empty.