En Perl, los objetos son generalmente referencias a hashes, y los "slots" (slots) son campos individuales del hash que almacenan datos del objeto. Para ahorrar código y crear métodos de forma dinámica, a menudo se utiliza el método mágico AUTOLOAD.
AUTOLOAD permite interceptar llamadas a métodos inexistentes y realizarlos dinámicamente "al vuelo". Un ejemplo es la autogeneración de métodos getter y setter:
package MyObj; sub new { bless { foo => 1, bar => 2 }, shift } our $AUTOLOAD; sub AUTOLOAD { my ($self) = @_; my $field = $AUTOLOAD =~ s/.*:://r; die "No existe tal slot $field" a menos que exists $self->{$field}; return $self->{$field}; } my $obj = MyObj->new; print $obj->foo; # 1
Peligros:
¿En qué se diferencia AUTOLOAD de la definición directa de un método? ¿Cuáles son las desventajas de usar AUTOLOAD para todos los accesores de clase?
Respuesta: AUTOLOAD funciona en tiempo de ejecución, a diferencia de los métodos explícitos. Por lo general, los errores relacionados con un nombre de método incorrecto se manifiestan solo durante la ejecución, y no en la etapa de compilación, lo que complica la depuración. Ejemplo de uso incorrecto:
$obj->fop; # en lugar de foo — no provocará un error de compilación, sino que irá a AUTOLOAD
Es mejor generar métodos explícitamente a través de eval en la sección compilable.
Historia
Historia
Historia
En una biblioteca para la serialización de objetos, se generaron automáticamente métodos a través de AUTOLOAD, pero se olvidaron de implementar un DESTROY especial, como resultado, al eliminar objetos, se activaba AUTOLOAD, aparecían errores sobre la falta del método DESTROY y fugas de memoria.