2006 年 4 月 16 日 22 時 48 分

メソッドの動的登録


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


シンボルテーブルは、パッケージ内部を参照するだけでなく、
それを編集することで、パッケージに動的に
サブルーチンや変数などを登録することができる。

グロブの変数各種を参照する場合は、
データ型に応じたデリファレンスをしたが、
グロブに変数各種を格納する場合は、
グロブ自身に、変数のリファレンスを代入する。

my $ver = '0.06';
*Version = \$ver;

こうすれば、$Version というスカラ変数が
パッケージに定義され、値として '0.06' が格納される。
これは、our $Version = '0.06 とほぼ同じだ。

変数だけでなく、サブルーチンを登録することもできる。
sub を使えば、コードリファレンスを作ることができるので、
それをグロブに代入すれば登録される。

my $mes = sub { print 'method' };
*method = $mes;

これで、現在のパッケージに method メソッドが登録される。

この方法を使って、Employee の salary ルーチンを
動的に登録してみると、以下のようになる。

my $salary = sub : lvalue {
    my $this = $_[0];
    tie(my $reflector, 'Employee::Reflector',
            $this, \&get_salary, \&set_salary);
    $reflector;
};

*salary = $salary;

sub は、パッケージ内にサブルーチンを宣言する以外にも、
動的にコードリファレンスを生成する役割もある。
分かりにくいが、sub の後に名前が続かない場合は後者だ。
上記の通り、lvalue ルーチンでも問題なく生成できるのだ。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.