什么是可靠地使用"isa()"的"最佳"方式?换句话说,它可以在任何值上正确工作,而不仅仅是一个对象.
"最佳",我的意思是缺乏未处理的角落案例以及缺乏潜在的性能问题,因此这不是一个主观问题.
这个问题提到了两种似乎可靠的方法(请注意,UNIVERSAL::isa()不应该使用旧式,并且在Q的答案中有充分记录的原因):
eval { $x->isa("Class") }
#and check $@ in case $x was not an object, in case $x was not an object
use Scalar::Util 'blessed';
blessed $x && $x ->isa($class);
Run Code Online (Sandbox Code Playgroud)
第一个使用eval,第二个使用B::(至少对于Scalar :: Util的非XS风味).
如果$x是包含类名的标量,第一个似乎不能正常工作,如下图所示,所以我倾向于#2(使用blessed),除非somoene指出一个很好的理由不这样做.
$ perl5.8 -e '{use IO::Handle;$x="IO::Handle";
eval {$is = $x->isa("IO::Handle")}; print "$is:$@\n";}'
1:
Run Code Online (Sandbox Code Playgroud)
有没有客观的理由选择这两种方法中的一种(或者我不知道的第三种方法),如性能,不处理某些特殊情况等等?