perl – 为什么不使用UNIVERSAL :: isa?

前端之家收集整理的这篇文章主要介绍了perl – 为什么不使用UNIVERSAL :: isa?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
根据这个

http://perldoc.perl.org/UNIVERSAL.html

我不应该使用UNIVERSAL :: isa(),而应该使用$ obj-> isa()或CLASS-> isa()。

这意味着要找出某些东西是否是第一个参考,然后是这个类的引用,我必须要做

eval { $poss->isa("Class") }

并检查$ @和所有那些gumph,否则

use Scalar::Util 'blessed';
blessed $ref && $ref->isa($class);

我的问题是为什么UNIVERSAL :: isa是怎么回事?对于像

my $self = shift if UNIVERSAL::isa($_[0],__PACKAGE__)

看看这个函数是否在对象上被调用。有没有一个很好的干净的选择,不会变得麻烦与&符号和潜在的长线?

解决方法

主要的问题是,如果直接调用UNIVERSAL :: isa,则绕过任何具有重载isa的类。如果这些类依赖于重载的行为(他们可能做的或者他们不会覆盖它),那么这是一个问题。如果你直接在你的祝福对象上调用isa,那么在这两种情况下都会调用正确的isa方法(如果存在则重载),UNIVERSAL ::如果不存在的话。

第二个问题是,UNIVERSAL :: isa只会像所有其他使用isa一样,在一个有福的参考中执行你想要的测试。它对于非保佑的引用和简单的标量具有不同的行为。所以你没有检查$ ref是否有福的例子是没有做正确的事情,你忽略错误条件并使用UNIVERSAL的备用行为。在某些情况下,这可能会导致微妙的错误(例如,如果变量包含类的名称)。

考虑:

use CGI;

my $a = CGI->new();

my $b = "CGI";

print UNIVERSAL::isa($a,"CGI");  # prints 1,$a is a CGI object.
print UNIVERSAL::isa($b,"CGI");  # Also prints 1!! Uh-oh!!

因此,总而言之,不要使用UNIVERSAL :: isa …直接对对象执行额外的错误检查和调用isa。

猜你在找的Perl相关文章