Perl'de nesneler genellikle hash'lere referanslardır ve "slotlar" (slotlar) nesnenin verilerini saklayan hash'in ayrı alanlarıdır. Kod tasarrufu sağlamak ve dinamik olarak yöntem oluşturmak için sıklıkla sihirli AUTOLOAD yöntemi kullanılır.
AUTOLOAD, mevcut olmayan yöntem çağrılarını yakalamayı ve dinamik olarak "anlık olarak" uygulamayı sağlar. Örnek — getter ve setter yöntemlerinin otomatik olarak oluşturulması:
package MyObj; sub new { bless { foo => 1, bar => 2 }, shift } our $AUTOLOAD; sub AUTOLOAD { my ($self) = @_; my $field = $AUTOLOAD =~ s/.*:://r; die "Böyle bir slot yok $field" unless exists $self->{$field}; return $self->{$field}; } my $obj = MyObj->new; print $obj->foo; # 1
Tehlikeler:
AUTOLOAD ile doğrudan yöntem tanımlaması arasındaki fark nedir? Tüm erişimciler için AUTOLOAD kullanmanın dezavantajları nelerdir?
Cevap: AUTOLOAD çalışma sırasında çalışır, açık yöntemlerin aksine. Genellikle yanlış yöntem ismiyle ilgili hatalar yalnızca çalıştırma sırasında ortaya çıkar, derleme aşamasında değil, bu da hata ayıklamayı zorlaştırır. Yanlış kullanım örneği:
$obj->fop; # foo yerine — derleme hatasına yol açmaz, AUTOLOAD’a girecektir.
Yöntemleri açıkça eval ile derleme bölümünde oluşturmak daha iyidir.
Hikaye
Hikaye
Hikaye
Nesnelerin serileştirilmesi için bir kütüphanede, AUTOLOAD aracılığıyla otomatik olarak çok sayıda yöntem oluşturuldu, ancak özel bir DESTROY yöntemi uygulamayı unuttular; bu nedenle nesneler silindiğinde AUTOLOAD tetiklendi, DESTROY yönteminin eksik olduğuna dair hatalar ortaya çıktı ve bellek sızıntısı oldu.