在Perl中获取对象的类名

use*_*855 9 perl

我有一个对象引用,它可能是对'FooInvalidResults'类型的对象的引用

有一个名为FooInvalidResults.pm的文件,其中有一行"包FooInvalidResults".

以下工作会怎样?

my $class = blessed $result;
if ($class eq 'FooInvalidResults') {
  # do something
} else {
  # do something else
}
Run Code Online (Sandbox Code Playgroud)

hob*_*bbs 15

字符串比较类名称通常是一个坏主意,因为它打破了基于子类型的多态性,并且因为对于对象的私密细节(如其确切的包名称)而言,通常不是很好的OO实践.

相反,写$result->isa('FooInvalidResults')- 或者,如果你对$result完全不是一个对象的可能性感到偏执,blessed $result && $result->isa('FooInvalidResults').

使用UNIVERSAL::isa是一个坏主意,因为一些对象(例如,用于测试的模拟对象)有合法的理由来覆盖该isa方法,并调用UNIVERSAL::isa它.


Mar*_*lis 1

你为什么不使用UNIVERSAL::isa

if UNIVERSAL::isa( $result, "FooInvalidResults" ) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

这是不好的建议,请使用

$obj->isa( 'FooInvalidResults' );
Run Code Online (Sandbox Code Playgroud)

我并没有完全意识到子例程调用(BAD)和方法调用(GOOD)之间的区别,但是在我自己做了一些RTFM之后,它变得清晰了(perldoc UNIVERSAL)。感谢(和+1)所有指出我的错误的人。