2

この場合、 UNIVERSAL::isa は機能しないことに注意してください。私は継承ツリーをたどりたくありません__PACKAGE__->isa('UNIVERSAL')

次に例を示します。

  use 5.10.1;
  use strict;
  use warnings;
  use utf8;
  {
    package Parent;
    #How to do this more elegantly?
    sub inherits_from_parent {
      no strict 'refs';
      return (__PACKAGE__ eq @{"$_[0]\::ISA"}[0]);
    }
  }
  {
    package Child;  
    use parent -norequire, qw(Parent);
  }
  package main;

  say "Child directly inherits from Parent"
    if Child->inherits_from_parent;
  #not wat I want 
  say 'Child is universal:'.Child->isa('UNIVERSAL');

no strict 'refs';クラスの直接の親を検出するためのより良い方法 (を使用せずに) はありますか? ありがとう。

4

1 に答える 1

5

クラスの配列を見ることに何か問題があるとは思いません。@ISA実際、これは Perl が行うことであり、ほぼ確実に診断モジュールが行うことです。strict理由がわかっている場合は、の一部をオフにすることは何も悪いことではないことを忘れないでください。これはそのようなケースの 1 つです。

あなたの実際の質問に対して、ちょっとしたグーグルでいくつかの可能性が生まれました.その中で、Curtis Poe(Ovid)Class::Sniffが最良の例かもしれません.

Data::Printerオブジェクトをダンプするとクラス階層が出力されることは知っています。その出力は人間の読者を対象としていますが、そのコードを見て何をするかを確認できる場合があります。繰り返しますが、あなたの例で行っていることとまったく同じことをほぼ確信しています!

于 2012-08-19T18:11:24.167 に答える