加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:19:34 所属栏目:大数据 来源:网络整理
导读:根据这个 http://perldoc.perl.org/UNIVERSAL.html 我不应该使用UNIVERSAL :: isa(),而应该使用$ obj- isa()或CLASS- isa()。 这意味着要找出某些东西是否是第一个参考,然后是这个类的引用,我必须要做 eval { $poss-isa("Class") } 并检查$ @和所有那些gu
根据这个

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。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读