ich genau dieses Erfordernis mehrmals in der Vergangenheit und heute habe hatte ich es tatsächlich von den Metaklasse zu tun, die keine BUILD Zwicken gemeint erlaubt. Auf jeden Fall fühlte ich, es wäre gut, zu teilen, da es genau im Grunde tut, was Äther erwähnt:
‚würde es erlauben Attribute„Markierung dieses faul ist, weil es auf andere Attributwerte ist abhängig gebaut werden, aber ich will . es vor Bau abgeschlossen stocherte werden "‘
jedoch Derp Derp ich keine Ahnung, wie so hier ein CPAN-Modul zu machen sind einige Codes: https://gist.github.com/TiMBuS/5787018
Setzen sie die oben in Late.pm und dann kannst du i benutzen t mögen so:
package Thing;
use Moose;
use Late;
has 'foo' => (
is => 'ro',
default => sub {print "setting foo to 10\n"; 10},
);
has 'bar' => (
is => 'ro',
default => sub {print 'late bar being set to ', $_[0]->foo*2, "\n"; $_[0]->foo*2},
late => 1,
);
#If you want..
__PACKAGE__->meta->make_immutable;
1;
package main;
Thing->new();
#`bar` will be initialized to 20 right now, and always after `foo`.
#You can even set `foo` to 'lazy' or 'late' and it will still work.
Sollten Sie 'default' nicht für das verwenden? Ich dachte, der Punkt von "faul" war, die Erstellung des Attributwerts bis zur ersten Verwendung zu verschieben. Wenn Sie bei der Konstruktion von Objekten alle Attribute festlegen müssen, scheint 'default' sinnvoller zu sein. Oder Sie können Ihre eigene BUILD-Methode angeben. –
Dies ist ein relativ gebräuchliches Idiom und es gibt einige gute Gründe dafür. – hobbs
Grundsätzlich könnten Sie alle Arbeiten in 'BUILD' erledigen, aber es ist schöner, eine Methode pro Attribut zu haben. Und wenn Sie eine Methode pro Attribut haben, um den Wert zu berechnen, dann kann es auch ein Builder sein. Wenn ein Builder jedoch auf andere Attribute zugreift, muss das erstellte Attribut träge sein, um sicherzugehen, dass sie initialisiert wurden. Und es gibt keine "faul, aber nur ein * bisschen * faul" Attribut Option :) – hobbs