parser

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

 

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

Ответ

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] ]