3
package AA;

package BB;
use AA;

package CC;
use BB;

CCを入れるuse AA必要がありますか、それとも暗黙的ですか?

4

4 に答える 4

9

何かによって以前にロードされている限り、モジュールを使用できます。これが、他のモジュールによって作成されたオブジェクトを、そのオブジェクト タイプを知らなくても使用できる理由です。たとえばHTTP::Response、メソッドから返されたオブジェクトを使用できますが、自分でLWPロードHTTP::Responseしたり、そのようなオブジェクトであることに気付いたりすることはありません。ただし、use呼び出し元の名前空間へのインポートのみであるため、それらのインポートは他のパッケージには表示されません (完全なパッケージ仕様でそれらを呼び出すことはできますが)。

useパッケージが直接使用したいモジュールを指定する必要があります。つまり、use直接作成するオブジェクトのモジュールです。

また、モジュールをロードするために他のパッケージに依存するべきではありません。誰かがそれらのモジュールを変更すると、なぜ壊れたのか疑問に思うでしょう。そして、その場合でも、モジュールのロード順序に依存して、すべてがうまくいくようにします。

于 2012-07-09T21:16:16.827 に答える
4

useは 2 つのことを行います: まだロードされていない場合はモジュールを ( by のように) ロードし、モジュールのメソッドrequireを呼び出します。importモジュールのロードやメソッドの呼び出しがどのように推移的になるかはわかりません。

2 番目の質問については、主に AA にimport方法があるかどうかによって異なります。

于 2012-07-09T19:30:43.887 に答える
1
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;削除されます。

于 2012-07-10T23:13:36.877 に答える
-1

これは主に、関連するモジュールがオブジェクト指向のものであるか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の両方からのすべてのメソッドは、を使用するだけで利用できます。BBAACCuse BB

于 2012-07-09T21:45:51.057 に答える