parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Фича: разреженный массив (sparse-array)

moko 11.09 15:35

Встроенный тип таблица и хеш с цифровыми ключами в достаточной степени закрывают в Parser 3 задачи, которые обычно решаются массивами.

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

И тут на помощь приходит он, похожий на хеш разреженный массив. От обычного массива отличается тем, что в нем могут быть неинициализированные элементы, которые методы работы с массивом пропускают. Если например задать $a.5[v5] и $a.2[v2], то перебор элементов покажет v2 и v5, без промежуточных пустых элементов.

Исторически в Парсере новый функционал добавляется с оглядкой на существующий. И с этой точки зрения текущий результат мне вполне нравится. Разреженный массив очень похож на хеш. Все базовые методы хеша, как например foreach, delete, contains, sort, select, count работают понятно и предсказуемо. Все хорошо с совместимостью, название класса уникальное, все методы хеша принимают массив как параметр. При разборе json массивы теперь преобразуются в разреженный массив. Передав опцию $.array[hash] можно вернуть старое поведение, чтобы создавался хеш. При обратном преобразовании в json можно указать $.array[object|array|compact] (сейчас названия как у опции $.table но можно поменять). object выводит с ключами, array с null элементами, а по умолчанию compact выводит массивом только заданные элементы.

В ночных сборках доступна версия парсера с разреженным массивом (sparse-array). Можно посмотреть, возможно появятся идеи и мнения по вопросам, которые предлагаю обсудить отдельными подтопиками. Пока не финальная версия, скорее наброски. Но в отличии от прошлых подходов к задаче результат нравится, поэтому закоммитил основную функциональность. Изменение существенное, поэтому вынес вопрос на широкое обсуждение.