F450

ブログ > エントリ > Perlで簡単アクセッサメソッド

2006/03/10(金) 16:48:57 (JST)

Perlで簡単アクセッサメソッド

さて、ひあるびWikiから記事をどんどん移して、ひあるびWikiの方を消してしまおうという魂胆ですよ。
これからは、「ひあるび」と「トイレットペーパーに字を書く筆圧で」の2大ひあるび系サイトを中心に更新していくわけです。
「2大」とかいって、ひあるび自体が小さい、もう、電子顕微鏡使わなきゃ見えないぐらい小さい存在ですからアレなんですが。“アレ”とか言って具体的日本語が浮かばない辺りがYOCKOWのボキャブラリーの少なさを物語っていますね。
…って、このままだとPerlの話になるまであと原稿用紙237枚分ぐらいの文章が要りそうなので、唐突に、もうそれは俄然Perlの話をば
さて、今やインタプリタ型言語だろうがコンパイラ型言語だろうが猫も杓子もオブジェクト指向ぢゃなきゃプログラミングしたくないわいというほどオブジェクト指向が蔓延って…もとい、流行っているわけですがPerlもその範疇から漏れません。
どうやってPerlでオブジェクト指向プログラミングをするのかっていう話はKtatさんの「Perlオブジェクト指向プログラミング」という記事が分かりやすく且つ詳しいのでそちらを見てもらうとして、この記事では“Perlで簡単アクセッサメソッド”の実現方法をメモっておこうかと思います。
あるクラスやそのインスタンスにあるメソッドが送信されても、そのクラスにそんなメソッドが定義されていない時、親クラスのそのメソッドを実行する前にAUTOLOADというメソッドがコールされます。これを使えばいいのです。
以下はOneClassというクラスでの例。
OneClass.pm
package OneClass;

use strict;
use vars qw($AUTOLOAD);

sub new {
    my $self = shift;
    my $var0 = shift;
    my $var1 = shift;
    return bless {'var0' => $var0, 'var1' => $var1}, $self;
}

sub AUTOLOAD {
    my $self = shift;
    my $method = $AUTOLOAD;
    $method =~ s/.*://;
    return if ($method eq 'DESTROY');
    return $self->{$method};
}

1;

__END__
test.pl
#!/usr/local/perl

use strict;
use OneClass;

my $obj = OneClass->new('1つ目のインスタンス変数', '2つ目のインスタンス変数');
print $obj->var0 . "\n";
print $obj->var1 . "\n";

__END__
実行結果
1つ目のインスタンス変数
2つ目のインスタンス変数
というように、OneClassではまったく、var0というメソッドもvar1というメソッドも定義されていないのに、ちゃんとアクセッサメソッドとして働くという話。
その要がAUTOLOAD。
まず、var0というメソッドがOneClassのインスタンスに送信される。するとvar0などというメソッドは定義されていないので、AUTOLOADに処理が渡される。
この時、$AUTOLOADという変数には'OneClass::var0'という文字が格納されているので、ここからvar0という文字をとりだして使用するというだけ。
The☆Perlで簡単アクセッサメソッド。
…いつの間にThe☆が。

このエントリへのコメント

このエントリにコメントはありません。
※コメントの新規投稿は現在のところ未実装です。