Как я могу проверить, имеет ли объект определенный метод?

Я хочу использовать метод объекта. Как $myObject->helloWorld().

Однако существует несколько методов, таким образом, я циклично выполняюсь через массив имен методов и называю метод как это:

my $methodName ="helloWorld";
$myObject->$methodNames;

Это работает довольно хорошее, но некоторые объекты не имеют всех методов.

Как я могу сказать ли $myObject назвали метод helloWorld или нет?

37
задан brian d foy 15 April 2010 в 18:55
поделиться

3 ответа

Вы можете использовать метод UNIVERSAL :: can для всех объектов, чтобы определить, какие методы он поддерживает:

if ($myObject->can($methodName)) {
    $myObject->$methodName;
}
48
ответ дан 27 November 2019 в 04:37
поделиться

Как заметил Эрик, вы можете обычно использовать UNIVERSAL :: can

Его можно использовать либо с объектом, как в вашем примере ( $ obj-> can ($ methodName) ) или статически, в классе: ( CLASS-> can ($ methodName) )

Обратите внимание, что существуют возможные ложноотрицательные результаты, связанные с использованием UNIVERSAL :: can об объектах / классах, у которых есть методы с автозагрузкой - подробности см. В perldoc . Поэтому, прежде чем использовать can () для объекта / класса, убедитесь, что рассматриваемый класс либо не использует AUTOLOAD, либо переопределяет can () для компенсации, либо использует прямое объявление для компенсации, как описано в perldoc can () - подсказка brian d foy)

Кроме того, будьте осторожны, обращайтесь ТОЛЬКО к can () на реальных объектах или инкапсулируйте его в eval. Он умрет, если вызывается для не-объекта (например, undef, скаляр и т. Д.)

13
ответ дан 27 November 2019 в 04:37
поделиться

Канонический способ использования can - внутри блока eval на случай, если вещь, которая есть в вашей скалярной переменной, на самом деле не является объектом. Вам не нужно беспокоиться об этом, потому что вы все равно получите правильный ответ (не объект или класс не может ответить методу):

 if( my $ref = eval { $obj->can( $method ) } ) {
      $obj->$ref( @args );
      }

can имеет дополнительную функцию, которая он возвращает ссылку на код метода. Иногда это может быть удобно.

9
ответ дан 27 November 2019 в 04:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: