Buzzurlの中の人日記
Perl で手軽にイタレータっぽいことをやりたいんだが
うぅむ、呼出し元にて丸括弧の中に中括弧があるのが、みっともないなぁ。もっと美しい書き方は無いものか。で、dankogai氏のページを見た: 404 Blog Not Found:perl - for(1..1e10) と Iterator

というのを見て、プロトタイプ宣言してやれば map とかみたいにコードブロック渡せるんじゃないか?とおもってやってみたら無理だったという話。

多分、元々やりたいことはRubyのiteratorみたいに
$sar->each {
   my ($time, $p) = @_;
   print ("$time : $p\n");
};

こんな風に書けるメソッドを書きたいということだろうと思う。

でも↓のbad_eachでは期待したようには動かない

勉強不足で知らなかったのだけど、コードブロックを使いたいときは最初の仮引数じゃないとダメらしい。

package Sar;
use strict;

sub new {
    my $class = shift;
    bless {
        "time" => { "a" => "1", "b" => "2" }
    }, $class;
}

#↓これはダメ。コードブロックは1番目の仮引数じゃないと
# my $sar = new Sar();
# $sar->bad_each {
#   my ($time, $p) = @_;
#   print ("$time : $p\n");
# };
# とは書けない。
#
# $sar->bad_each( sub {
#   my ($time, $p) = @_;
#   print ("$time : $p\n");
# } );
# でないとコンパイルエラー
sub bad_each ($&){
    my ($this, $yield) = @_;
    my %times = %{$this->{time}};
    map{
        &{$yield}($_, $times{$_})
    } sort keys %times;
    undef;
}

最初の仮引数じゃなきゃだめということは、メソッドとしては実装できないので関数でやるしかないっぽい。

組み込みのmap/grep/sortなんかとの整合性としては正しい仕様という気もするけれど。

# Perlでコードブロックを使いたいときは、
#メソッドじゃなくて関数として実装するしかない?
# my $sar = new Sar();
# Sar::good_each {
#   my ($time, $p) = @_;
#   print ("$time : $p\n");
# } $sar;
sub good_each (&$) {
    my ($yield, $obj) = @_;
    my %times = %{$obj->{time}};
    map{
        &{$yield}($_, $times{$_})
    }sort keys %times;
    undef;
}

1;

しかしコードブロックのあとに渡すのがリストじゃなくてオブジェクトなのは気持ち悪いことこの上ない。でもリストを渡そうとする場合、$sar->{time}を隠蔽できない。アクセサなりなんなり適切なアクセス手段を用意してやればいいのだけど、$sar->{time}の詳細を見せるんだったら eachメソッドなんていらないという話だろう。

とはいえ、Perlとしてはこうやるのが自然という気がする。(iyahayaさんは$sar->{time}を隠蔽したりしたいのだろうから、これは邪道だけど)

my $sar = new Sar();
    my %times = %{$sar->{time}};
    map {
        print "$_ : $times{$_}\n"
    }sort keys %times;
この記事にコメントする
お名前
タイトル
文字色
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
プロフィール
HN:
ajiyoshi
性別:
男性
自己紹介:
プログラマです。
ソーシャルブックマークサービス「Buzzurl」の開発者です。

はてなブックマークカウンタ


旧*「ふっかつのじゅもんがちがいます」カウンタ
Buzzurl

powered by Buzzurl

Twitter

カレンダー
08 2010/09 10
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
最新コメント
[07/23 つらら]
[07/23 れいら]
[06/16 婚活]
[05/28 あっだ]
[05/28 もも]
最新トラックバック
バーコード
ブログ内検索
忍者ポイント
カウンター
アクセス解析
あわせて読みたい
あわせて読みたい
Powered by ニンジャブログ  Designed by ゆきぱんだ
Copyright c *「ふっかつのじゅもんがちがいます。」 All Rights Reserved
忍者ブログ / [PR]生命保険 ダイエット