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