ishiducaの日記 このページをアンテナに追加 RSSフィード

2009-06-07

[]コールバック 15:58 コールバック - ishiducaの日記 を含むブックマーク はてなブックマーク - コールバック - ishiducaの日記 コールバック - ishiducaの日記 のブックマークコメント

関数の引数に関数を使うための作法

関数の戻り値ではなく、関数自体を引数として使う場合に

引数には関数のリファレンスを使う。例えばこんな感じで

&呼び出し側の関数名(\&呼び出される関数名 [,引数])

もしくは

&呼び出し側の関数名(sub{ コード } [,引数])

この例だと、コールバック関数(呼び出される関数)を第一引数に使っているけど、そうじゃなくてもOK


定義済みの関数をコールバック関数として使う

呼び出し側の関数(call)の引数に合計関数(sum)と平均関数(ave)を使う

#!/usr/bin/perl -wl
use strict;

my @numbers = (2,3,4);

&call(\&sum, @numbers);
&call(\&ave, @numbers);

exit 0;

sub call{
    my $func = shift;
    # &$func(@_);
    print $func->(@_);
}
sub sum{
    my $total = 0;
    foreach( @_ ){
        $total += $_;
    }
    $total;
}
sub ave{
    my $num = scalar @_;
    return &sum(@_) / $num;
}

無名の関数をコールバック関数として使う

引数の積を返す関数(無名関数)を使った例

#!/usr/bin/perl -wl
use strict;

my @numbers = (2,3,4);

&call(
    sub{
        my $total = shift;
        foreach( @_ ){
            $total = $total * $_;
        }
        $total;
    },
    @numbers
);

exit 0;

sub call{
    my $func = shift;
    # &$func(@_);
    print $func->(@_);
}

どんな時に使うの?

この辺が僕のレベルだと実感できないところ...

AnnaAnna2012/06/09 10:23All things consiedred, this is a first class post

rvhdcehrvhdceh2012/06/11 08:33Q5JSaZ , [url=http://uvzzandysfar.com/]uvzzandysfar[/url], [link=http://bnmtgyflvzuc.com/]bnmtgyflvzuc[/link], http://zmpkmfryvhbu.com/

gmapbgsgmapbgs2012/06/12 09:14qJxUtY <a href="http://wlkttxdymmib.com/">wlkttxdymmib</a>

abghbisgjumabghbisgjum2012/06/13 14:41fEhPTB , [url=http://plreemopexig.com/]plreemopexig[/url], [link=http://beegqavxwwns.com/]beegqavxwwns[/link], http://biqkouwvhkkx.com/

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20090607