Ho avuto questo requisito esatto diverse volte in passato, e oggi ho dovuto farlo dal metaclasse, il che significava non tweaking BUILD permesso. Comunque ho pensato che sarebbe stato bello condividere dato che fondamentalmente fa esattamente quello etere menzionati:
'Permetterebbe marcatura attributi "questo è pigro, perché dipende su altri valori degli attributi da costruire, ma voglio . di essere pungolato prima finiture di costruzione "'
Tuttavia, derp derp mi hanno alcuna idea di come fare un modulo CPAN quindi ecco alcuni codici: https://gist.github.com/TiMBuS/5787018
Mettere il sopra in Late.pm e allora puoi usare i Mi piace così:
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.
fonte
2013-06-12 10:36:16
Non dovresti usare 'default' per quello? Pensavo che il punto di "pigro" fosse di posticipare la creazione del valore dell'attributo fino al primo utilizzo. Se hai bisogno di impostare tutti gli attributi nella costruzione degli oggetti, 'default' sembra più utile. Oppure puoi fornire il tuo metodo 'BUILD'. –
Questo è un idioma ragionevolmente comune e ci sono alcuni motivi decenti per questo. – hobbs
Fondamentalmente, si potrebbe fare tutto il lavoro in 'BUILD', ma è meglio avere un metodo per attributo. E se hai intenzione di avere un metodo per attributo per calcolare il valore, allora potrebbe anche essere un costruttore. Ma se un costruttore sta per accedere ad altri attributi, allora l'attributo costruito deve essere pigro per essere sicuro che sia stato inizializzato. E non c'è un "pigro, ma solo un * piccolo bit * pigro" opzione attributo :) – hobbs