2

BUILDメソッドでファイルを読み取る必要があり、MooseX::Storageパッケージのloadメソッドを使用したいと思います。
ただし、このloadメソッドは新しいオブジェクトを作成するため、オブジェクトをインスタンス化すると、これはファイルから読み取られたオブジェクトではありません。以下のコードでは、ファイルを書き込むために状態2のオブジェクト$ m1を作成し、ファイルを読み取るためのパラメーターなしで$ m2を作成しますが、$m2に正しい値が含まれていません。その包み:

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();
4

1 に答える 1

5

あなたのコードは、BUILDがコンストラクターであるかのように動作しているように見えますが、そうではありません。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();
于 2010-04-20T15:14:46.877 に答える