| Новости | 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.