2010-04-20 1 views
2

Мне нужно прочитать файл в методе BUILD, и я хочу использовать метод загрузки пакета MooseX :: Storage.
Но этот метод загрузки создает новый объект, поэтому, когда я устанавливаю объект, это не объект, считанный из файла. В приведенном ниже коде я создаю объект $ m1 с состоянием 2 для записи файла, я создаю $ m2 без параметра для чтения файла, но $ m2 не содержит правильного значения. Пакет:Moose: Загрузка объекта из файла по методу BUILD

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(); 
+0

Вы могли бы хотеть пересмотреть свое имя пакета/класса. В Perl соглашение состоит в том, что только прагмы должны иметь все имена нижних регистров. См. Perlstyle-- http://perldoc.perl.org/perlstyle.html – daotoad

ответ

5

Ваш код, кажется, действует как если BUILD является конструктором, который он не является - это больше похоже на послестроительного крюком где вы можете выполнять другие вещи, такие как чтение значений из БД. Вы должны вместо этого либо:

  • магазин результат 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(); 
+0

Спасибо, эфир, но как я могу использовать результат mia-> load как объекта? Если я пишу $ self-> load, он генерирует ошибку en ... – Gabriella

+0

@Gabriella: вы пытаетесь объединить переменные состояния (которые вы передаете в конструктор) с объектом, конструктор которого является методом загрузки - я разделил их на две. – Ether