Получение имени класса объекта в Perl - PullRequest
9 голосов
/ 26 сентября 2011

У меня есть ссылка на объект, и это может быть ссылка на объект типа 'FooInvalidResults'

Существует файл с именем FooInvalidResults.pm, и в нем есть строка 'package FooInvalidResults'.

будет работать следующая?

my $class = blessed $result;
if ($class eq 'FooInvalidResults') {
  # do something
} else {
  # do something else
}

Ответы [ 3 ]

15 голосов
/ 26 сентября 2011

Сравнение имен классов в целом является плохой идеей, потому что это нарушает полиморфизм, основанный на подтипах, и потому, что обычно не очень хорошо, чтобы ОО был так любопытен к интимным деталям объекта, как его точное имя пакета.

Вместо этого напишите $result->isa('FooInvalidResults') - или, если вы не уверены, что $result вообще не является объектом, blessed $result && $result->isa('FooInvalidResults').

Использование UNIVERSAL::isa - плохая идея, потому что некоторые объекты (например, фиктивные объекты для тестирования) имеют законные причины для переопределения метода isa, и вызов UNIVERSAL::isa нарушает это.

1 голос
/ 26 сентября 2011

Почему вы не использовали UNIVERSAL::isa?

if UNIVERSAL::isa( $result, "FooInvalidResults" ) {
   ...
}

Это был плохой совет , пожалуйста, используйте

$obj->isa( 'FooInvalidResults' );

Я не был полностью осведомлено разнице между вызовом подпрограммы (BAD) и вызовом метода (GOOD), но это стало ясно после того, как я сам сделал некоторые RTFM (perldoc UNIVERSAL).Спасибо (и +1) всем, кто указал на мою ошибку.

0 голосов
/ 26 сентября 2011

Также возможно выполнять работу с помощью встроенного ref(), а не Scalar::Util::blessed():

$ perl -E '$ref = {}; bless $ref => "Foo"; say ref $ref'
Foo

Обратите внимание, что если ссылка не благословлена, будет возвращен тип ссылки:

$ perl -E '$ref = {}; say ref $ref'
HASH

Однако, как уже упоминали другие, UNIVERSAL::isa является лучшим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...