2015-01-14 1 views
3

Я разработал функцию, возвращающую таблицу объектов. Содержимое этого объекта еще не определено, но я хотел бы сделать глубокую копию между каждым вызовом (как в Java).Выполняет ли memoize глубокую копию Perl-объектов?

Как memoize возвращает возвращаемое значение? Это делает ее глубокой? Ничего не сказано, как ответы копируются перед возвратом в справке модуля Memoize.

# How i solved the problem at first.... 
use Storable qw(dclone); 
my $saved_value ; # undef 
sub get_all { 
    return dclone($saved_value) if (defined $saved_value) ; 
    .... 
    $saved_value = dclone($ans) ; 
    return $ans 
} 

ответ

4

Попробуйте и посмотрите?

use Memoize; 
sub foo { {bar=>[1..4]} } 
memoize('foo'); 
foo()->{'bar'}[3] = 5; 
print foo()->{'bar'}[3]; 

отпечатки 5, поэтому он не делает глубокую копию. Я оставляю вид, если он делает даже мелкую копию как упражнение.

+1

Простое возвращение из вспомогательного объекта делает мелкую копию, если это не подделка ': lvalue'. – ikegami

+0

У меня такой же результат. Функция 'foo' переустанавливается каждый раз, когда она вызывается без отсрочки:' foo(); #reexecution; foo() -> {...}; # no reexecution' –