web-dev-qa-db-ja.com

Perl 5の親とベースの違いは何ですか?

parent という名前の新しいプラグマがあります。これは base とほぼ同じことを行います。新しい(非コア)モジュールを保証するparentは何をしますか?私は何かが足りないのですか?

48
Chas. Owens

baseは、モジュールのロードを自動的に処理するだけでなく、すでにロードされているクラスから(おそらくモジュール名に基づかない名前のファイルから)継承を確立できるようにするなど、多くのことを実行しようとしました。それを機能させるために、いくつかのケースで驚くべき結果を引き起こすいくつかのハッカーがありました。下位互換性を損なうのではなく、よりクリーンなセマンティクスを備えた新しい置換プラグマparentが導入されました。

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

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

51
ysth

Ysthからの余分な情報を武器に、ドキュメントの違いを確認することができました。

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

  • 名前付きパッケージを@ISAに追加します
  • require を使用して、指定されたパッケージと同じ名前のモジュールをロードします(パッケージがすでにロードされていることを検出しない限り)
  • パッケージと同じ名前のモジュールが存在しなくても失敗しません
  • 指定されたパッケージにシンボルがない場合は終了します
  • 名前付きパッケージに$VERSIONが存在しない場合、baseはそれを"-1, set by base.pm"に設定します。
  • 名前付きパッケージが存在する場合は、そのパッケージの fields を初期化します
  • 指定されたパッケージのインポート関数を呼び出さない

parent プラグマは次のことを行います。

  • 名前付きパッケージを@ISAに追加します
  • requireを使用して、指定されたパッケージと同じ名前のモジュールをロードします
  • パッケージと同じ名前のモジュールが存在しない場合に死なないように指示するオプションを受け入れます
37
Chas. Owens