parser

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

 

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

Класс массива (array) - реализован весь обсужденный функционал

moko 10.10 01:09 / 10.10 03:11

Весь новый функционал покрыт тестами и доступен в ночных сборках, в том числе и под Windows.

Инициализация массива:
$a[v1;v2;v3...]
Или $a[^array::create[$array_or_hash]]
Или $a[^array::sql{select query}]
Или $a[^json:parse[["v1","v2",3]]]
Обращение к элементу и присвоение значения элементу массива аналогично хешу с числовыми индексами:
$a.1 и $a.1[value]
Если задать в массиве все элементы (от нулевого до последнего), получится обычный массив. Но можно инициализировать только часть элементов, тогда получится разряженный массив (c "дырками"). Этой возможностью можно не пользоваться, но она делает массив полностью совместимым с хешом с числовыми индексами. Массив можно передавать параметром в методы хеша и у массива есть большинство методов хеша, которые работают аналогично:
^a.foreach[i;v]{code}
^a.add[$h]
^a.count[] или ^a.count[all], если нужно посчитать и дырки
^a.keys[]
^a.delete(i) - на месте элемента получается дырка
^a.contains(i)
^a.reverse[]
^a.sort[i;v]($v)
Методы отбора части элементов. Часть методов похожи на методы строки, другая аналогична методам хеша:
^a.left(n)
^a.right(n)
^a.mid(n;m)
^a.select[i;v]($v>2)
^a.at(n) - n не индекс, а порядковый номер ("дырки" пропускаются), еще может быть строкой first или last
Кроме того, у массива есть методы похожие на методы таблицы:
^a.join[$b] - добавляет элементы переданного массива или хеша в конец массива (add перезаписывает элементы с одинаковыми индексами)
^a.append[e1;e2;...] - добавляет элементы в конец массива, сколько параметров, столько элементов и будет добавлено.
^a.insert(1)[e1;e2;...] - вставляет элементы в указанную позицию массива.
И свои методы:
^a.remove(1) - удаляет элемент на указанной позиции со сдвигом последующих элементов
^a.for[i;v]{code} - итерируется и по не инициализированным элементам
Методы некоторых классов теперь могут возвращать массив. Сейчас это:
^table.cells[] - возвращает массив всех или ^table.cells(n) первых n ячеек текущего ряда таблицы
^строка.split[,][a] - возвращает массив при указании опции поиска 'a'
И ремарка касательно ^array::sql{}. По умолчанию результатом запроса считается обычный массив, но если передать опцию $.sparse(true), в первой колонке должен возвращаться индекс и поведение метода становится очень похожим на ^hash::sql{}. Кроме того, ^array::sql{} поддерживает множественные запросы с разными колонками в результате, например $a[^array::sql{select name from person^; select nick, food from pets}]

По умолчанию размер массива ограничен миллионом элементов, можно изменить, задав значение переменной $MAIN:LIMITS.max_array_size

Из планов: для полной совместимости с текущей версией дать возможность задать $json:array[hash], чтобы при парсинге массива в json как и сейчас создавался хеш с цифровыми ключами. Это уже можно задать у конкретного ^json:parse[], но при обновлении парсера на сайте может быть удобнее задать это один раз в auto.p.