In Perl zijn objecten meestal verwijzingen naar hashes, en "slots" zijn afzonderlijke velden van de hash die de gegevens van het object opslaan. Voor codebesparing en dynamische methode-creatie wordt vaak de magische methode AUTOLOAD gebruikt.
AUTOLOAD maakt het mogelijk om aanroepen van niet-bestaande methoden af te vangen en ze dynamisch "on the fly" te implementeren. Een voorbeeld is de autogeneratie van getter- en setter-methoden:
package MyObj; sub new { bless { foo => 1, bar => 2 }, shift } our $AUTOLOAD; sub AUTOLOAD { my ($self) = @_; my $field = $AUTOLOAD =~ s/.*:://r; die "Geen slot $field" tenzij exists $self->{$field}; return $self->{$field}; } my $obj = MyObj->new; print $obj->foo; # 1
Gevaren:
Wat is het verschil tussen AUTOLOAD en een directe methode-definitie? Wat zijn de nadelen van het gebruik van AUTOLOAD voor alle accessors van de klasse?
Antwoord: AUTOLOAD werkt op het moment van uitvoering, in tegenstelling tot expliciete methoden. Gewoonlijk worden fouten die verband houden met onjuiste methodenamen alleen tijdens de uitvoering onthuld, niet tijdens de compilatie, wat de debugging bemoeilijkt. Voorbeeld van onjuist gebruik:
$obj->fop; # in plaats van foo — zal geen compilatiefout veroorzaken, maar komt in AUTOLOAD terecht
Het is beter om methoden expliciet te genereren via eval in de compileerbare sectie.
Verhaal
Verhaal
Verhaal
In een bibliotheek voor objectserialisatie werden methoden automatisch gegenereerd via AUTOLOAD, maar men vergat een speciale DESTROY te implementeren, wat resulteerde in het feit dat bij het verwijderen van objecten AUTOLOAD werd aangeroepen, wat leidde tot fouten over het ontbreken van de DESTROY-methode en geheugenlekkage.