2015-11-09 38 views
1

爲了性能的原因,我想用懶惰的駝鹿對象替換我的程序中使用的一些散列。問題是,有很多我不控制的代碼,當然,使用->{key}來訪問元素。這樣的訪問與工作對象的駝鹿,但他們被初始化之前不與懶惰的工作:作爲一個懶散列的駝鹿對象

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您可以創建一個調用底層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