parser

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

 

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

Нашел по форуму код от Misha v.3 для глубокого копирования хеша @Hash_DeepCopy, но боюсь его использовать, из-за "магии" поведения которой мне не понятно доконца, кто-то (включая Misha v.3 :) может прокомментировать как это р

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 почему-то нет }
      }
   }