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请记住,当您知道自己为什么要这样做时,关闭部分功能并没有什么坏处,这就是其中一种情况。

对于您的实际问题,谷歌搜索已经产生了一些可能性,其中柯蒂斯坡(奥维德)Class::Sniff可能是最好的例子。

我知道Data::Printer当你转储一个对象时会打印出类层次结构。它的输出是供人类读者使用的,但您也许可以查看它的代码以了解它的作用。同样,我几乎可以肯定它完全符合您在示例中所做的事情!

于 2012-08-19T18:11:24.167 回答