package AA;
package BB;
use AA;
package CC;
use BB;
CCを入れるuse AA
必要がありますか、それとも暗黙的ですか?
package AA;
package BB;
use AA;
package CC;
use BB;
CCを入れるuse AA
必要がありますか、それとも暗黙的ですか?
何かによって以前にロードされている限り、モジュールを使用できます。これが、他のモジュールによって作成されたオブジェクトを、そのオブジェクト タイプを知らなくても使用できる理由です。たとえばHTTP::Response
、メソッドから返されたオブジェクトを使用できますが、自分でLWP
ロードHTTP::Response
したり、そのようなオブジェクトであることに気付いたりすることはありません。ただし、use
呼び出し元の名前空間へのインポートのみであるため、それらのインポートは他のパッケージには表示されません (完全なパッケージ仕様でそれらを呼び出すことはできますが)。
use
パッケージが直接使用したいモジュールを指定する必要があります。つまり、use
直接作成するオブジェクトのモジュールです。
また、モジュールをロードするために他のパッケージに依存するべきではありません。誰かがそれらのモジュールを変更すると、なぜ壊れたのか疑問に思うでしょう。そして、その場合でも、モジュールのロード順序に依存して、すべてがうまくいくようにします。
use
は 2 つのことを行います: まだロードされていない場合はモジュールを ( by のように) ロードし、モジュールのメソッドrequire
を呼び出します。import
モジュールのロードやメソッドの呼び出しがどのように推移的になるかはわかりません。
2 番目の質問については、主に AA にimport
方法があるかどうかによって異なります。
package AA;
package BB;
use AA;
package CC;
use BB;
以下とほぼ同じです。
package CC;
use BB;
BEGIN{ require AA }
また
package CC;
use BB;
use AA ();
これは、use
が 2 つのことを行うためです。でファイルをロードし、メソッドをrequire
呼び出します。import
したがって、これらは同等です。
use Module qw'LIST';
BEGIN { require Module; Module->import( qw'LIST' ); }
パッケージBB
が行を必要としなくなった場合、問題が発生する可能性があり、use AA;
削除されます。
これは主に、関連するモジュールがオブジェクト指向のものであるかExporter
、呼び出し元のパッケージでシンボルを使用できるようにするために使用する単純なモジュールであるかによって異なります。
use
最初に指定されたモジュールにアクセスしてから、そのメソッドrequire
を呼び出します。import
require
最初%INC
に、モジュールがすでに正常にロードされているかどうかを確認します。そうでない場合は、 のすべてのパスで@INC
一致するモジュール ファイルが検索され、最初に一致したものが に相当するものでロードされdo
ます。
modulesimport
メソッドは作成者が書きたいと思ったことは何でも実行できますが、一般にモジュールはサブクラス化され、特にパッケージの配列内のシンボルを呼び出し元のパッケージにコピーし、シンボルを完全修飾せずに使用できるようにExporter
するメソッドを提供します。パッケージ名で。import
@IMPORT
あなたの例では、モジュールがサブクラスの場合、にExporter
リストされているシンボルが名前空間@BB::IMPORT
にコピーされCC
、そのパッケージから使用できます。ただし、何もインポートされていないため、そこからのサブルーチンは、明示的にetcAA
として呼び出すことによってのみ呼び出すことができます。AA::subroutine()
一方、パッケージがオブジェクト指向のモジュールおよびBB
サブクラスAA
である場合、通常、import
呼び出すメソッドはなく、メソッドは bless された変数またはクラス名 (パッケージ名) を介してアクセスされます。で定義されていないメソッドはBB
継承することができAA
、オブジェクト指向継承システムの Perl の実装は、@ISA
メソッドの検索を続行する場所を決定するためにパッケージの配列を使用します。
要約すると、モジュールがBB
サブクラスである場合Exporter
は、use AA
. しかし、それがオブジェクト指向でサブクラスの場合、とAA
の両方からのすべてのメソッドは、を使用するだけで利用できます。BB
AA
CC
use BB