Perl Moose:在构建方法中从文件加载对象
我必须在BUILD方法中读取一个文件,我想使用MooseX::Storage包的load方法。 但是这个加载方法创建了一个新的对象,所以当我恢复这个对象时,它不是从文件中读取的对象。在下面的代码中,我创建了一个状态为2的对象$m1来写入文件,我创建了没有参数的$m2来读取文件,但是$m2不包含正确的值。 一揽子计划:Perl Moose:在构建方法中从文件加载对象,perl,build,moose,Perl,Build,Moose,我必须在BUILD方法中读取一个文件,我想使用MooseX::Storage包的load方法。 但是这个加载方法创建了一个新的对象,所以当我恢复这个对象时,它不是从文件中读取的对象。在下面的代码中,我创建了一个状态为2的对象$m1来写入文件,我创建了没有参数的$m2来读取文件,但是$m2不包含正确的值。 一揽子计划: package mia; use Moose; use MooseX::Storage; with Storage(format => 'JSON', io => '
package mia;
use Moose;
use MooseX::Storage;
with Storage(format => 'JSON', io => 'File');
has 'nome' => ( is => 'rw', isa => 'Str', default =>'',);
has 'stato' => ( is => 'rw', isa => 'Int', default =>1,);
sub BUILD {
my $self=shift;
if ($self->stato==1){
$self=mia->load("mia.dat");
}
if ($self->stato==2){
$self->stato(0);
$self->nome("prova");
$self->store("mia.dat");
}
}
sub stampa(){
my $self=shift;
print $self->nome." ".$self->stato;
}
主程序
use mia;
my $m;
$m1=mia->new(stato=>2);
$m2=mia->new();
print "\nm1 \n";
$m1->stampa();
print "\nm2 \n";
$m2->stampa();
您的代码看起来好像构建是一个构造函数,而事实并非如此——它更像是一个构建后钩子,您可以在其中执行其他操作,比如从DB读取值。您应该: 将mia->load的结果存储在属性中,并可以选择使用委托方法来访问它,或者 使用mia->load的结果作为对象,而不是构建一个单独的对象。 下面是第一种情况的示例,将MooseX::Storage对象与控制它的对象分离:
package miaController;
use Moose;
use mia;
has 'nome' => ( is => 'rw', isa => 'Str', default =>'',);
has 'stato' => ( is => 'rw', isa => 'Int', default =>1,);
has 'mia' => ( is => 'rw', isa => 'mia', lazy => 1);
sub BUILD
{
my $self = shift;
if ($self->stato == 1)
{
$self->mia(mia->load("mia.dat"));
}
elsif ($self->stato == 2)
{
$self->stato(0);
$self->nome("prova");
$self->mia->store("mia.dat");
}
}
sub stampa
{
my $self = shift;
print $self->nome." ".$self->stato;
}
package mia;
use Moose;
use MooseX::Storage;
with Storage(format => 'JSON', io => 'File');
package main:
use miaController;
my $m1=miaController->new(stato=>2);
my $m2=miaController->new();
print "\nm1 \n";
$m1->stampa();
print "\nm2 \n";
$m2->stampa();
谢谢你,但是我如何使用mia->load的结果作为对象呢?如果我写$self->load it generate en error…@Gabriella:您试图将传递到构造函数的状态变量与构造函数为load方法的对象组合在一起-我已将它们拆分为两个。您可能需要重新考虑包/类名。在Perl中,约定是只有pragma应该具有所有小写名称。见佩尔斯泰尔-