2009-02-12 12 views
8

Mam następujący kod w mojej klasie:Jak mogę użyć kodu ref jako callback w Perlu?


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); 
} 

i skrypt zawierający następujący kod:


use strict; 
use warnings; 
use MyPackage; 

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

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

ale pojawia się następujący błąd:

Not a CODE reference ... 

co ja brakujący? Drukowanie ref($self->{callback}) pokazuje CODE. Działa, jeśli używam $self->{callback}->($arg), ale chciałbym użyć innego sposobu wywoływania kodu ref.

+1

Dlaczego chcesz inny sposób na wyłuskiwanie kodu ref? Użyj tego, co działa i przejdź do następnego problemu. :) –

Odpowiedz

18

Amperand jest wiążący tylko dla $self, a nie całość. Można zrobić nawiasów klamrowych wokół części, która zwraca odwołanie:

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

ale

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

jest powszechnie uważany za czystsze, dlaczego nie chcesz go używać?

+0

Mój perl jest trochę zardzewiały. Wiedziałem, że czegoś mi brakuje, i chciałem się dowiedzieć, co to było :). Dziękuję Adam! – Geo

Powiązane problemy