parser

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

 

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

4PAF

Lifesource 16.12.2002 10:52

Итак, начну повествование...
Уважаемый Александр, видимо Вы очень интересно реализовали метод
^hash::create[$existing_hash], я так понял(= почти уверен), что он работает следующем образом:
он создаёт в памяти новый объект(хоть на этом спасибо:)), затем пробигает по каждому значению
существуюшего хеша, и просто в связи с правилами передачи параметров копирует значения
в новый хеш, таким образом получается, если значение число или строка, то всё это передаётся
в новый хэш по значению, а если объект(я пробовал, только с хешем), то в значение содержится
указатель на объект, ну и не долго думая он копирует указатель, вот и получается:
т.к. структура hash of hash, это не что иное, как области памяти связаные указателями,
грубо говоря они практически не зависимы(если узнать указатель вложеного хеша, то можно
запросто с ним работать...)
и в этоге мы не скопиравали вложеные хеши, а просто добавили новую точку входа:(((
Я не знаю, так ли это и задумовалось или нет, но если фича то такие вещи нужно указывать
в доках, если нет то баг чистой воды или не дороботка.

Привожу ниже тестовый код:
@main[]
$global_hash[$.row1(10)
             $.row2[$.21(210)
                    $.22(220)]
             $.row3[$.31(310)
                    $.32(320)]]
^process_hash[$global_hash]

@process_hash[this_hash][local_hash]
$local_hash[^hash::create[$this_hash]]
#$local_hash[^hash::create[^hash_create[$this_hash]]]
BEFORE<br> 
global hash=^show_ready_hash[$this_hash]<br>
local hash=^show_ready_hash[$local_hash]<br>
^local_hash.row2.add[$.21($this_hash.row3.31)]
^local_hash.row3.add[$.31($this_hash.row2.21)]
AFTER<br>
global hash=^show_ready_hash[$this_hash]<br>
local hash=^show_ready_hash[$local_hash]<br>

###########эти коменты снять, но потом
^rem{
$my_hash[$.1(222)
         $.trep[$.bla(1)
                $.hush(2)
                ]]
$new_my_hash[^hash::create[^hash_create[$my_hash]]]
my+hash=^show_ready_hash[$my_hash]
}
###########

@hash_create[temp_hash][key;value]
^if($temp_hash is 'hash'){
    ^temp_hash.foreach[key;value]{
	  ^if($value is 'hash'){
	  	$result.$key[^hash_create[$value]]} 	
	     }{
	     	$result.$key[$value]
		}
	}{$result[no_hash]}
	

@show_ready_hash[this_hash][key;val]
^if($this_hash is 'hash'){
<ul>
^this_hash.foreach[key;val]{
	^if($val is 'hash'){
		<li>$key^[
		^show_ready_hash[$val]
			^]		
	}{
		<li> ^if($val is 'string'){$key^[$val^]}{$key^($val^)}
	}
}[</li>]
</ul>}{<font color="red"><b>The parameter is not hash! This is its value=</b></font>$this_hash}
посмторите на значения по ключам после AFTER...
так что думаю я прав...

я попытался написать свой метод копирования хеша
@hash_create[]
,
но что-то не получилось...
чтоб его в действие видеть, снимите ^rem{}

Итак эпилог:
если это всё же фича, то пожалуйста научите как с этим работать...
а если недороботка, то как можно обойти(=что нужно исправить в методе
@hash_create[]
)

P.S. а вы говорите нечего людям голову забивать,
ведь для кого позиционируется(!=используют) Парсер, в основном понятия не имеют,
что такое объекты и как они представлены в памяти, вот вам пример такого удивления
при работе с Парсером:
$my_image[^image::create(200;200;0x00000)]
$new_my_image[$my_image]
^new_my_image.bar(50;50;150;150;0xFFFFFF)
$response:body[^my_image.gif[]]
вот и объясняй ему потом, почему квадрата Малевича не получилось:))))