Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

AE::cv->cb のコールバック実行タイミングについての小噺

$cv を実行が終わるまで取っておこうとして、

package CVPrinter;
use strict;
use warnings;
use AnyEvent;

sub new { bless {}, $_[0] }
sub print_cv {
    my ($self, $cv) = @_;
    $cv->cb(sub {
        my ($v) = $_[0]->recv;
        print $v, "\n";
        delete $self->{cv}; # (1)
    });

    $self->{cv} = $cv;      # (2)
}

なんて書き方をすると、

my $cv = AE::cv;
my $t = AE::timer 0, 0, sub { $cv->("HELLO") };

のような$cvだと想定通りの動作だけど、

my $cv = AE::cv;
$cv->("HELLO");

のような$cvを渡すと$self->{cv}は空っぽにはならないよって話。


cbに渡したルーチンはコールバックなので後で呼ばれそうなイメージがあるけど、先にsendが済んでいる場合はその場で呼ばれてしまう。ので(1)と(2)の実行順は完全にケースバイケース。