2015-11-09 3 views
1

Я хочу заменить некоторые хеши, используемые в моей программе, с ленивыми объектами Муха по соображениям производительности. Проблема в том, что есть много кода, который я не контролирую, который использует, конечно, ->{key} для доступа к элементам. Такой доступ работает с Moose объектами, но не работает с ленивых, прежде чем они были инициализированы:Лось-объект как ленивый хеш

package Stuff; 

use Moose; 

has foo => (
    lazy=>1, 
    default=> sub { +{bar=>baz} } 
); 

package main; 
my $x = Stuff->new(); 

print Dumper $x->{foo}; # undef =(
print Dumper $x->foo; # {bar => baz } 
print Dumper $x->{foo}; # {bar => baz } 

Любой способ сделать первый $x->{foo} инициализировать переменную?

+1

https://metacpan.org/pod/Tie::Moose кажется полезным, возможно, – AKHolland

+0

@AKHolland лото! Позаботьтесь, чтобы ответить на него, чтобы я согласился? – letitbee

+0

Изменен в форме ответа. Рад помочь. – AKHolland

ответ

1

Вы не можете использовать его как хэш напрямую, но с Tie::Moose вы можете создать хеш, который вызывает лежащие в основе методы Лося. Вы можете передать этот хэш вместе с другим кодом.

use Tie::Moose; 

my $x = Stuff->new(); 
tie my %x, "Tie::Moose", $x; 

print Dumper($x{foo}); # { 'bar' => 'baz' } 
0

Итак, вы хотите, чтобы код запускался всякий раз, когда к элементу вашего хеш-объекта обращаются? Это возможно с помощью magic, но это значительно замедлит доступ к вашему объекту.

+0

Медленно, чем что-то вроде 'return $ x -> {foo} // = $ x-> foo()'? – letitbee

+0

Да, потому что альтернатива должна была бы сделать это в дополнение к подзаголовку. – ikegami