Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
G_Z 30.11.2019 03:41 / 30.11.2019 03:44
Второй метод работает со странностями. Если указать key:Это из-за перекрытия имени переменной именем, переданным в аргументах.
То в результате поедут ключи
^hash.foreach[key;value]{—>
^hash.foreach[_key;_value]{Пересечение всё равно не исключено, конечно, но уже менее вероятно.
И вторая - если метод ничего не находит - он возвращает ключи с которых были хэшиДа, правильно.
Я это вылечил проверкой что из рекурсии что-то пришло
@select[hash;key_name;value_name;condition;options][locals] $result[^hash::create[]] $recursive(^options.recursive.bool(false)) $index(0) ^hash.foreach[_key;_value]{ ^if($_value is hash && $recursive){ ^result.add[^select[$_value;$key_name;$value_name]{ $caller.$key_name[$$key_name] $caller.$value_name[$$value_name] $condition }[$options]] }{ $caller.$key_name[$_key] $caller.$value_name[$_value] ^if($condition){ ^result.add[^hash.at($index)[hash]] } } ^index.inc[] } @select[hash;key_name;value_name;condition;options][locals] $result[^hash::create[]] $recursive(^options.recursive.bool(false)) $index(0) ^hash.foreach[_key;_value]{ ^if($_value is hash && $recursive){ $selected[^select[$_value;$key_name;$value_name]{ $caller.$key_name[$$key_name] $caller.$value_name[$$value_name] $condition }[$options]] ^if($selected){ $selected[$.$_key[$selected]] } }{ $caller.$key_name[$_key] $caller.$value_name[$_value] ^if($condition){ $selected[^hash.at($index)[hash]] } } ^result.add[$selected] ^index.inc[] }
Эту конструкциюРаспишу подробно, может кому пригодится.
$caller.$key_name[$$key_name]
Я не пойму наверное никогда
@main[] ^select[ $.a[ $.b(2) ] ][key;value]($value == 2)Для $.a отработает первая ветка if'а (для рекурсивного случая) и метод позовёт сам себя.
$caller.$key_name[$_key] $caller.$value_name[$_value]Там будут [1]:
$key[b] $value[2]Но контекст $condition — @main[] (0), нужно пойти выше к нему, фактически в $caller.caller, и установить key-value там, но ведь у нас рекурсия, а значит глубину мы не знаем.
{ $caller.$key_name[$$key_name] $caller.$value_name[$$value_name] $condition }Контекст junction-обёртки — @select[] (1), в котором есть нужные переменные (#1).
$key_name[key] $value_name[value] $$key_name —> $key $$value_name —> $valueТаким образом, установим в @main[] (псевдокод, до точки — метод-контекст):
$main.key[$local.key] $main.value[$local.value]и получим в @main[] (0):
$key[b] $value[2]После чего, код $condition($value == 2) в контексте @main[] (0) успешно отработает и вернёт true.