Sono un novizio assoluto a Moose
e finora ho letto Moose
e la maggior parte del Cookbook.Come posso accedere agli attributi di sola lettura degli oggetti Moose?
Ci sono alcune cose che non capisco. Ho creato il seguente pacchetto:
package MyRange;
use Moose;
use namespace::autoclean;
has [ 'start', 'end' ] => (
is => 'ro',
isa => 'Int',
required => 1,
);
__PACKAGE__->meta->make_immutable;
1;
Poi:
use MyRange;
my $br = MyRange->new(
start => 100,
end => 180
);
ora posso accedere ai miei campi utilizzando per esempio $br->{start}
, ma posso anche modificarli (sebbene siano "di sola lettura") utilizzando ad es. $br->{start}=5000
. Posso anche aggiungere nuove chiavi come $br->{xxx}=111
.
Mi manca qualcosa? L'oggetto non è protetto in qualche modo? Qual è il significato di ro
?
+1 Grazie! Un follow-up, se posso: ho alcuni campi che non sono richiesti. Se non sono impostati, e provo ad accedere a quei valori 'undef', mi piacerebbe ricevere un errore. Devo impostare un lettore per ognuno di essi? O forse per usare qualche sub di tipo 'die' in' default'? –
Si potrebbe voler creare una nuova domanda per una risposta più dettagliata su questo, ma: si dispone di un progetto in cui i valori non sono inizialmente richiesti, ma l'utente è autorizzato a compilarli in seguito utilizzando i metodi writer e deve farlo prima di chiamare alcune funzionalità che lo utilizzano? La maggior parte delle volte, dovresti probabilmente ripensare il tuo progetto lì, ma nei rari casi in cui ha senso, la mia estensione 'MooseX :: LazyRequire' potrebbe essere utile.Tutto ciò che fa è rendere obbligatorio un attributo, ma rimandare l'eccezione dal tempo di costruzione al momento in cui si accede a attr. – rafl
Si noti inoltre che è possibile chiedere a Moose di generare i metodi del predicato per voi. Quelli che è possibile utilizzare per verificare esplicitamente se un valore è stato impostato per alcuni attributi tramite i metodi del costruttore o dello scrittore. Questo è particolarmente utile per gli attributi che non sono richiesti e per i quali 'undef' è un valore valido. – rafl