вызвать метод через возвращенный ref из "can" - PullRequest
2 голосов
/ 10 мая 2011

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

$methodref->(@args)

Но когда вызывается метод из его ссылки, возвращенной из "can", он кажется несовместимым.

$methodref = $my_obj->can(my_method);
$my_obj->$methodref(@args) if $methodref; # why it isn't $my_obj->$methodref->(@args)?

Может кто-нибудь пролить свет на это?

Спасибо, CC

Ответы [ 4 ]

3 голосов
/ 10 мая 2011

Причина в том, что объект должен быть первым, что передано в функцию.Это автоматически делается для вас, если вы делаете вызов метода.Но $methodref->($my_obj, @args) тоже будет работать.

2 голосов
/ 10 мая 2011

Ссылка CODE, возвращаемая can, не имеет объекта, связанного с ним после выполнения can.Вот почему вам все еще нужно использовать объект в качестве инвоканта.

Обратите внимание, что это опасно, поскольку больше нет никакой гарантии, что этот метод должен вызываться для этого объекта.Я полагаю, вы могли бы сделать что-то вроде этого:

$objmethref =  $my_obj->can("methname") && sub { $my_obj->methname(@_) };

# then later
$objmethref->(@args);

, но я не уверен, что именно вы действительно хотите сделать.

1 голос
/ 10 мая 2011
$my_obj->$methodref->(@args)

- это

( $my_obj->$methodref() )->(@args)

Другими словами, он вызовет метод без аргументов и попытается использовать результат в качестве ссылки на функцию.Это совсем не то, что вам нужно

Очевидное средство для его вызова -

$methodref->($my_obj, @args)

, но Perl предоставляет синтаксис, который выглядит как вызов метода для вашего удовольствия.

$my_obj->$methodref(@args)
0 голосов
/ 10 мая 2011

$methodref->(@args) - это вызов функции, а не вызов метода, поэтому объект не будет передаваться автоматически.

$my_obj->$methodref->(@args) вызовет метод $ methodref без параметров, отличных от параметра объекта, и используетего возвращаемое значение как coderef, вызывающее это и передающее ему указанные аргументы.

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