Я хочу использовать метод объекта. Как $myObject->helloWorld()
.
Однако существует несколько методов, таким образом, я циклично выполняюсь через массив имен методов и называю метод как это:
my $methodName ="helloWorld";
$myObject->$methodNames;
Это работает довольно хорошее, но некоторые объекты не имеют всех методов.
Как я могу сказать ли $myObject
назвали метод helloWorld
или нет?
Вы можете использовать метод UNIVERSAL :: can
для всех объектов, чтобы определить, какие методы он поддерживает:
if ($myObject->can($methodName)) {
$myObject->$methodName;
}
Как заметил Эрик, вы можете обычно использовать UNIVERSAL :: can
Его можно использовать либо с объектом, как в вашем примере ( $ obj-> can ($ methodName)
) или статически, в классе: ( CLASS-> can ($ methodName)
)
Обратите внимание, что существуют возможные ложноотрицательные результаты, связанные с использованием UNIVERSAL :: can
об объектах / классах, у которых есть методы с автозагрузкой - подробности см. В perldoc . Поэтому, прежде чем использовать can ()
для объекта / класса, убедитесь, что рассматриваемый класс либо не использует AUTOLOAD, либо переопределяет can ()
для компенсации, либо использует прямое объявление для компенсации, как описано в perldoc can ()
- подсказка brian d foy)
Кроме того, будьте осторожны, обращайтесь ТОЛЬКО к can ()
на реальных объектах или инкапсулируйте его в eval. Он умрет, если вызывается для не-объекта (например, undef, скаляр и т. Д.)
Канонический способ использования can
- внутри блока eval
на случай, если вещь, которая есть в вашей скалярной переменной, на самом деле не является объектом. Вам не нужно беспокоиться об этом, потому что вы все равно получите правильный ответ (не объект или класс не может ответить методу):
if( my $ref = eval { $obj->can( $method ) } ) {
$obj->$ref( @args );
}
can
имеет дополнительную функцию, которая он возвращает ссылку на код метода. Иногда это может быть удобно.