[英]Getting classname of a object in Perl
我有一个对象引用,它可能是对'FooInvalidResults'类型的对象的引用
有一个名为FooInvalidResults.pm的文件,其中有一行“包FooInvalidResults”。
以下工作会怎样?
my $class = blessed $result;
if ($class eq 'FooInvalidResults') {
# do something
} else {
# do something else
}
字符串比较类名称通常是一个坏主意,因为它打破了基于子类型的多态性,并且因为对于对象的私密细节(如其确切的包名称)而言,通常不是很好的OO实践。
相反,写$result->isa('FooInvalidResults')
- 或者,如果你对$result
完全不是一个对象的可能性感到偏执,那么blessed $result && $result->isa('FooInvalidResults')
。
使用UNIVERSAL::isa
是一个坏主意,因为一些对象(例如,用于测试的模拟对象)有合理的理由来覆盖isa
方法,并且调用UNIVERSAL::isa
会破坏它。
你为什么不使用UNIVERSAL::isa
?
if UNIVERSAL::isa( $result, "FooInvalidResults" ) {
...
}
这是不好的建议 ,请使用
$obj->isa( 'FooInvalidResults' );
我没有完全意识到子程序调用(BAD)和方法调用(GOOD)之间的区别,但是在我自己做了一些RTFM( perldoc UNIVERSAL
)之后就变得很清楚了。 谢谢(和+1)所有指出我的错误的人。
也可以使用ref()
内置而不是Scalar::Util::blessed()
来完成这项工作:
$ perl -E '$ref = {}; bless $ref => "Foo"; say ref $ref'
Foo
请注意,如果引用没有被祝福,这将返回引用类型:
$ perl -E '$ref = {}; say ref $ref'
HASH
但是,正如其他人所提到的, UNIVERSAL::isa
是一个更好的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.