Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Misha v.3 30.01.2015 05:54 / 30.01.2015 06:16
$hCopy.[$key][^hash::create[^copyHash[$value]]]=>
$hCopy.[$key][^copyHash[$value]]ниже чуть доработанный метод (который копирует даты, _default и не падает на хэшах с рекурсией и ключём "foreach"):
@hashDeepCopy[h] ^if($h is "hash"){ $result[^_hashDeepCopy[$h;^hash::create[]]] }{ ^throw[;Param must be hash] } @_hashDeepCopy[h;info][uid;k;v;j] $uid[^reflection:uid[$h]] $result[$info.$uid] ^if(!$result){ $result[^hash::create[$h]] $info.[$uid][$result] $j[^reflection:method[$h;foreach]] ^j[k;v]{ ^if($v is hash){ $result.[$k][^_hashDeepCopy[$v;$info]] }($v is int || $v is double){ $result.[$k]($v) }($v is table){ $result.[$k][^table::create[$v]] }($v is date){ $result.[$k][^date::create[$v]] } } }и небольшой тест:
@USE debug/Erusage.p debug/Debug.p @main[] $h1[ $.v[$VOID] $.sa[1] $.sb[2] $.sc[3] $.sd[] $.bt(true) $.bf(false) $.na(1) $.nb(2) $.ta[^table::create{a b c^#0A1 2 3^#0A11 22 33}] $.tb[^table::create[nameless]{1 2 3^#0A11 22 33}] $.fa[^file::create[asd;$.name[file.txt]]] $.ia[^image::create(100;100)] $.da[^date::create(2009;01;02;03;04;05)] $.db[^date::create(2009;01;02;03;04;05)] $.ha[ $.hasa[1] $.hasb[2] $.hasc[3] $.haha[ $.hahasa[11] $.hahasb[22] ] $.habt(true) $.habf(false) $._default[default value] ] $.foreach[фак ю Спилберг (c) :)] ] $h1.recursion[$h1] $copy[$self.hashDeepCopy] $h2[^copy[$h1]] # модицифируем исходный хэш после копирования ^h1.delete[v] ^h1.na.inc(1) ^h1.ha.delete[hasa] $h1.ha.hasd[4] ^h1.ta.append{111 222 333} ^h1.da.roll[month](+1) # замеряем время работы 10000 итераций метода ^Erusage:compact[$.bForce(true)] ^Erusage:measure{^for[i](0;9999){$z[^copy[$h1]]}}[v] # выводим ^dstop[ $.v[$v] $.h2[$h2] $.h1[$h1] $.recursion-copy-check[$h2.recursion.sb] $.default-copy-check[$h2.ha.zzz] ]