2009-05-18 13 views

答えて

47

baseは、あまりにも多くのことをしようとしました—は、読み込みモジュールを自動的に処理するだけでなく、既に読み込まれたクラス(おそらくモジュール名に基づいていないファイルから)から継承を確立することもできます。それを動作させるようにするために、場合によっては驚くべき結果を引き起こすハッカーがいくつかありました。下位互換性を破る代わりに、新しい置換プラグマparentが導入され、よりクリーンなセマンティクスが導入されました。

parentは、5.10.1のコアモジュールになります。

更新:parentは行いません。これは、(あなたがfieldsプラグマを使用している場合)basefieldsを処理することを忘れてしまいました。

+21

また、perl -wE'sayを必要とするベースを 'perl -wE'sayに必要な親' – ysth

34

ysthからの情報の余分なビットを武器に、私はドキュメントの違いを見ることができた:

baseプラグマは、次のことを行います

  • @ISA
  • にという名前のパッケージを追加します
  • requireを使用して、指定されたパッケージと同じ名前のモジュールをロードします(既にパッケージがロードされていることが検出されない限り)
  • は、 $VERSION場合
  • という名前のパッケージに存在しませんという名前のパッケージにはシンボルが存在しない場合に電子パッケージと同じ名前が
  • ダイを存在しない、ベースは
  • はという名前のパッケージのfields初期化"-1, set by base.pm"に設定します

    :彼らが存在する場合
  • parentプラグマは、次のことを行いという名前のパッケージ

のインポート機能を呼び出すことはありません。

  • require
  • を使用して、指定されたパッケージは、パッケージと同じ名前のモジュールが」doesnの場合は死ぬことはないことを伝えるオプションを受け入れると同じ名前のモジュールをロード@ISA
  • にという名前のパッケージを追加しますt存在する
+4

ほぼと比較してください。 norequireオプションはrequireをしないように指示するだけです(クラスが既にロードされている必要があります)。つまり、エラーをトラップする必要がなく、抑止するかどうかを決める必要はありません。 – ysth

関連する問題