Ich habe Probleme mit dem Attribut Initialisierungsreihenfolge im folgenden:Moose Attribut gesetzt, um Schwierigkeiten
driver.pl
my $foo = MyApp::Boom->new(configfile => "/home/todd/text.cfg");
MyApp :: Boom
has configfile => (
is => 'ro', isa => 'Str', required => 1
);
has conf => (
is => 'ro', isa => 'HashRef', required => 1, lazy => 1,
builder => '_build_configuration'
);
sub _build_configuration {
my $self = shift;
unless ($self->configfile) {
die "No Configuration File!";
}
# stuff that reads the file and creates a hashref
return $href;
}
has baz => (
is => 'ro', isa => 'MyApp::Baz', required => 1, lazy => 1,
builder => '_build_baz',
);
sub _build_baz {
my $self = shift;
my $conf = $self->conf;
# uses data in conf to do stuff and create a MyApp::Baz
return MyApp::Baz->new($conf);
}
# other stuff omitted....
Als ich das laufen driver.pl, bekomme ich manchmal eine Fehlermeldung "No Configuration File" und manchmal funktioniert es. Ich vermisse offensichtlich etwas Wichtiges an 'Faul' und 'Pflicht', kann es aber nicht herausfinden.
Mein Verständnis ist die "Configfile" würde durch den neuen Aufruf in driver.pl gesetzt werden und die Attribute würden initialisiert, wenn anderswo aufgerufen und vermutlich "configfile" wäre bereits festgelegt.
Zeiger, Empfehlungen oder alternative Ansätze sind willkommen.
Dies ist offensichtlich nicht der Code, den Sie ausgeführt haben ... – ikegami
Ich sehe nicht, wie dies möglicherweise sogar manchmal funktioniert, es sei denn, Sie haben einige Methode 'Config' weggelassen, die' $ self> configfile'. Ich denke, es gibt einen einfachen Tippfehler in '_build_configuration()': 'falls ($ self> config)' sollte 'sein, außer ($ self> configfile)'. Abgesehen davon ist das 'required' auf' conf' überflüssig, da es sowieso faul ist, aber es tut auch nicht weh. – mbethke
Es gibt auch den 'sub baz' gegen den automatisch generierten Accessor für die Eigenschaft' baz' und das Fehlen von 'sub _build_baz'. Ich stimme @mbethke zu. Dieser Code ist nicht das, was Sie ausgeführt haben. Bitte schreibe hier keinen neuen Code. Bearbeite deine Frage und zeige deinen ** echten ** Code, oder wir können nicht helfen. – simbabque