gpt4 book ai didi

perl - 为什么我不应该使用UNIVERSAL::isa?

转载 作者:行者123 更新时间:2023-12-03 13:39:59 26 4
gpt4 key购买 nike

根据这个

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 - 为什么我不应该使用UNIVERSAL::isa?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/204316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com