In Perl, gli oggetti sono generalmente riferimenti a hash, e i "slot" sono campi distinti dell'hash che memorizzano i dati dell'oggetto. Per risparmiare codice e creare dinamicamente metodi, si usa spesso il metodo magico AUTOLOAD.
AUTOLOAD consente di intercettare le chiamate a metodi inesistenti e di implementarli dinamicamente "al volo". Esempio: generazione automatica di metodi getter e setter:
package MyObj; sub new { bless { foo => 1, bar => 2 }, shift } our $AUTOLOAD; sub AUTOLOAD { my ($self) = @_; my $field = $AUTOLOAD =~ s/.*:://r; die "No such slot $field" unless exists $self->{$field}; return $self->{$field}; } my $obj = MyObj->new; print $obj->foo; # 1
Pericoli:
Qual è la differenza tra AUTOLOAD e una definizione diretta del metodo? Quali sono i contro dell'uso di AUTOLOAD per tutti gli accessori della classe?
Risposta: AUTOLOAD funziona a tempo di esecuzione, a differenza dei metodi espliciti. Di solito, gli errori legati a nomi di metodi errati si manifestano solo durante l'esecuzione e non durante la compilazione, il che rende il debug più difficile. Esempio di uso scorretto:
$obj->fop; # invece di foo — non provoca un errore di compilazione, finirà in AUTOLOAD
È meglio generare esplicitamente i metodi tramite eval in una sezione compilabile.
Storia
Storia
Storia
In una libreria per la serializzazione degli oggetti, i metodi sono stati generati automaticamente tramite AUTOLOAD, ma si è dimenticato di implementare un DESTROY speciale; di conseguenza, durante la rimozione degli oggetti, si attivava AUTOLOAD, apparivano errori riguardo all'assenza del metodo DESTROY e perdite di memoria.