Perlのオブジェクトは通常、ハッシュへの参照であり、「スロット」はオブジェクトのデータを格納するハッシュの個別のフィールドです。コードの節約と動的メソッドの生成のために、しばしば魔法のメソッドAUTOLOADが使用されます。
AUTOLOADは、存在しないメソッドの呼び出しをキャッチし、「即座に」動的に実装することを可能にします。例として、ゲッターとセッターのメソッドを自動生成することができます:
package MyObj; sub new { bless { foo => 1, bar => 2 }, shift } our $AUTOLOAD; sub AUTOLOAD { my ($self) = @_; my $field = $AUTOLOAD =~ s/.*:://r; die "そのスロットは存在しません: $field" unless exists $self->{$field}; return $self->{$field}; } my $obj = MyObj->new; print $obj->foo; # 1
危険性:
AUTOLOADは直接メソッドを定義するのとどう違うのですか?クラスのすべてのアクセサにAUTOLOADを使用することの欠点は何ですか?
答え: AUTOLOADは実行時に機能し、明示的なメソッドとは異なります。通常、メソッド名の誤りに関連するエラーはコンパイル時ではなく実行時にのみ現れ、これがデバッグを難しくします。不適切な使用の例:
$obj->fop; # fooではなく — コンパイルエラーにはならず、AUTOLOADに入る
明示的にevalを使ってメソッドを生成する方が良いです。
物語
物語
物語
オブジェクトのシリアル化ライブラリでは、自動的にAUTOLOADを介してメソッドが生成されましたが、特別なDESTROYを実装するのを忘れたため、オブジェクトを削除する際にAUTOLOADが発動し、DESTROYメソッドが存在しないというエラーが発生し、メモリリークが発生しました。