作为惰性哈希的 Moose 对象

Moose object as a lazy hash

出于性能原因,我想用懒惰的 Moose 对象替换程序中使用的一些哈希值。问题是,有很多我无法控制的代码当然使用 ->{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}初始化变量?

所以您希望代码在访问哈希对象的元素时 运行?使用 magic 是可能的,但它会大大减慢对您的对象的访问速度。

您不能直接将它用作散列,但使用 Tie::Moose 您可以创建一个散列来调用底层的 Moose 方法。您可以将此哈希值传递给您的其他代码。

use Tie::Moose;

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

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