Что такое "лучший" способ использовать "isa()" надежно? Другими словами, он корректно работает с любым значением, а не только с объектом.
"Лучшим", я имею в виду недостаток необработанных угловых дел, а также отсутствие потенциальных проблем с производительностью, поэтому это не субъективный вопрос.
В этом вопросе упоминаются два подхода, которые кажутся надежными (обратите внимание, что старый стиль UNIVERSAL::isa()
не должен использоваться, с причинами, хорошо задокументированными в ответах на этот вопрос Q ):
eval { $x->isa("Class") }
#and check [email protected] in case $x was not an object, in case $x was not an object
use Scalar::Util 'blessed';
blessed $x && $x ->isa($class);
Первый использует eval
, второй использует B::
(по крайней мере, для не-XS-аромата Scalar:: Util).
Первое не работает корректно, если $x
- это скаляр, содержащий имя класса, как показано ниже, поэтому я склоняюсь к # 2 (используя blessed
), если только somoene не указывает на вескую причину.
$ perl5.8 -e '{use IO::Handle;$x="IO::Handle";
eval {$is = $x->isa("IO::Handle")}; print "$is:[email protected]\n";}'
1:
Есть ли какие-либо объективные причины для выбора одного из этих двух подходов (или третьего я не знаю), таких как производительность, а не обработка какого-либо специального случая и т.д.?