2010-04-20 4 views
2

Je dois lire un fichier dans la méthode BUILD et je veux utiliser la méthode de chargement du paquet MooseX :: Storage.
Mais cette méthode de chargement crée un nouvel objet et quand j'institue l'objet, ce n'est pas l'objet lu du fichier. Dans le code ci-dessous je crée un objet $ m1 avec l'état 2 pour écrire le fichier, je crée $ m2 sans paramètre pour lire le fichier mais $ m2 ne contient pas la bonne valeur. Le paquet:Moose: Charger l'objet du fichier dans la méthode 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; 
} 

le programme principal

use mia; 
my $m; 

$m1=mia->new(stato=>2); 
$m2=mia->new(); 
print "\nm1 \n"; 
$m1->stampa(); 
print "\nm2 \n"; 
$m2->stampa(); 
+0

Vous pourriez vouloir reconsidérer votre nom package/classe. En Perl, la convention est que seuls les pragmas devraient avoir tous les noms en minuscules. Voir perlstyle-- http://perldoc.perl.org/perlstyle.html – daotoad

Répondre

5

Votre code semble agir comme si BUILD est un constructeur qui n'est pas - il est plus comme un crochet post-construction où vous pouvez effectuer d'autres choses comme lire les valeurs d'une base de données. Vous devriez plutôt soit:

  • stocker le résultat de mia->load dans un attribut, et éventuellement utiliser des méthodes déléguées à y accéder, ou
  • utiliser le résultat de mia->loadcomme l'objet, plutôt que de construire une séparée .

Voici un exemple du premier cas, séparant l'objet MooseX :: Stockage de l'objet qui le contrôle:

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

Merci Ether, mais comment puis-je utiliser le résultat de mia-> load comme objet? Si j'écris $ self-> le charger génère une erreur .... – Gabriella

+0

@Gabriella: vous essayez de combiner des variables d'état (que vous passez dans le constructeur) avec un objet dont le constructeur est la méthode de chargement - j'ai divisé les en deux. – Ether

Questions connexes