作为惰性哈希的 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' }
出于性能原因,我想用懒惰的 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' }