Попробовал скомпилировать пару флеш-класов с помощью 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 не получается, даже при наличии исходников
что реально нужно с этим делать - непонятно
Всё-таки нет,
Значит всё-таки аналога нет, спасибо
Отправить комментарий