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。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |