| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
andylars 16.06.2015 11:42 / 16.06.2015 13:21
Собственно код:@Hash_DeepCopy[h] ^rem{# собственно сам метод, вспом.метод понадобился в основном по причине магии с uid?}
^if($h is "hash"){
$result[^_hashDeepCopy[$h;^hash::create[]]] ^rem{# передаем во вспом.метод целевой хеш и объект пустой хеш }
}{
^throw[;Param must be hash]
}
@_hashDeepCopy[h;info][uid;k;v;j] ^rem{# следим за руками: $h-целевой хеш, $info-пустой хеш (место копирования) }
$uid[^reflection:uid[$h]] ^rem{# получаем $uid целевого хеша, зачем? }
$result[$info.$uid] ^rem{# что это такое? у меня масса предположений, в частности что это выход из рекурсии, но не уверен в понимании всей затеи }
^if(!$result){ ^rem{# не знал, что неприсвоенный $result возвращает bool... }
$result[^hash::create[$h]] ^rem{# задаем результат ответа: плоскую копию целевого хеша, если дальнейшее не исполнится }
$info.[$uid][$result] ^rem{# создаем "болванку" $info.$uid-of-target[плоская_копия_целевого_хеша] }
$j[^reflection:method[$h;foreach]] ^rem{# трикс какой-то... видимо позволяет обходить $._default ключи, в отличие от прямого foreach, опять же интересно почему }
^j[k;v]{ ^rem{# триксовый foreach k-ключ, v-значение }
^if($v is hash){
$result.[$k][^_hashDeepCopy[$v;$info]] ^rem{# если $v это хеш, рекурсивно вызываем этот метод с параметрами $v-целевой хеш, $info - куда... тут сдаюсь пока }
}($v is int || $v is double){ ^rem{# если число, то просто присваивае }
$result.[$k]($v)
}($v is table){ ^rem{# если таблица, копируем таблицу }
$result.[$k][^table::create[$v]]
}($v is date){ ^rem{# если дата, копируем дату }
$result.[$k][^date::create[$v]]
} ^rem{# is string почему-то нет }
}
}