Как определить, реализует ли объект метод в Perl? - PullRequest
6 голосов
/ 20 января 2009

У меня есть полиморфный массив объектов, которые реализуют два (неформальных) интерфейса. Я хочу быть в состоянии различить их с отражением по линии:

if (hasattr(obj, 'some_method')) {
    # `some_method` is only implemented by one interface.
    # Now I can use the appropriate dispatch semantics.
} else {
    # This must be the other interface.
    # Use the alternative dispatch semantics.
}

Может быть, что-то вроде этого работает?:

if (*ref(obj)::'some_method') {
    # ...

Мне трудно сказать, когда синтаксис попытается вызвать подпрограмму и когда она вернет ссылку на подпрограмму. Я не слишком знаком с таблицами символов пакетов ATM и просто пытаюсь что-то взломать. : -)

Заранее спасибо!

1 Ответ

16 голосов
/ 20 января 2009
use Scalar::Util qw(blessed);
if( blessed($obj) and $obj->can('some_method') ){ 

}

"can" - это метод, унаследованный всеми классами от UNIVERSAL . Классы могут переопределить этот метод, но это не очень хорошая идея.

Также «can» возвращает ссылку на функцию, поэтому вы можете сделать:

$foo->can('some_method')->( $foo , @args );

или

my $sub = $foo->can('some_method'); 
$foo->$sub( @args ); 

Редактировать Обновлен синтаксис цепочки, благодаря Брайану Филлипсу

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