Как я могу использовать код ссылки в качестве обратного вызова в Perl? - PullRequest
8 голосов
/ 13 февраля 2009

В моем классе есть следующий код:


sub new {
    my $class = shift;
    my %args  = @_;
    my $self  = {};
    bless( $self, $class );
    if ( exists $args{callback} ) {
        $self->{callback} = $args{callback};
    }
    if ( exists $args{dir} ) {
        $self->{dir} = $args{dir};
    }
    return $self;
}

sub test {
  my $self = shift;
  my $arg  = shift;
  &$self->{callback}($arg);
}

и скрипт, содержащий следующий код:


use strict;
use warnings;
use MyPackage;

my $callback = sub {
   my $arg = shift;
   print $arg;
};

my $obj = MyPackage->new(callback => $callback);

но я получаю следующую ошибку:

Not a CODE reference ...

Чего мне не хватает? Печать ref($self->{callback}) показывает CODE. Это работает, если я использую $self->{callback}->($arg), но я хотел бы использовать другой способ вызова кода ref.

1 Ответ

18 голосов
/ 13 февраля 2009

Амперсанд привязан только к $self, а не ко всему. Вы можете делать скручивания вокруг части, которая возвращает ссылку:

&{$self->{callback}}($arg);

Но

$self->{callback}->($arg);

обычно считается чище, почему бы вам не использовать его?

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