それで、最近、Perl と Moose を使用するプロジェクトに取り組んでいます。Moose が MOP 上に構築されていることは理解しています。私は MOP にあまり詳しくなく、理解できないことに遭遇しました。理論的な説明を使用できます。モジュールnamespace::autoclean
のドキュメントは次のとおりです。
SYNOPSIS
package Foo;
use namespace::autoclean;
use Some::Package qw/imported_function/;
sub bar { imported_function('stuff') }
# later on:
Foo->bar; # works
Foo->imported_function; # will fail. imported_function got cleaned after compilation
つまり、私が Moose を使用する前は、オブジェクトのメソッドを呼び出す方法は次のとおりでした: Perl インタープリターは、オブジェクトが bless されたパッケージのシンボル テーブルでそのメソッドを検索します (見つからない場合は、@ISA
相続など)。パッケージ内からインポートされた関数を呼び出す方法は、パッケージのシンボル テーブルで関数の名前を検索することでした。私がこれまでに知っている限り、どちらの方法でも同じシンボル テーブルを意味するため、この動作は不可能なはずです。
ソースの最初の検査は生産的ではありませんでした。大まかに言えば、Moose、MOP、および namespace::autoclean を使用すると、この種のトリックが可能になるという点で何が違うのでしょうか?
編。特に明確にするために、私use namespace::autoclean
が
CHECK { undef *Foo::imported_function }
を見つける場所がわからないため、ドキュメントに記載されているFoo->bar;
呼び出しがクラッシュします。Foo->bar
imported_function