2006 年 4 月 25 日 19 時 27 分

メソッドの動的呼び出し


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


昨日の考察により、コードリファレンスを使って、
オブジェクトのメソッドを呼ぶことは、
継承上の問題を生ずるため使えないことが判明した。

では、メソッドを動的に呼び出すにはどうすれば良いか。
Perl には、メソッドへのリファレンスは存在しないため、
事前に分かっていないメソッドを引き渡すには、
文字列によるメソッド名の指定しかない。

では名前を使ってメソッドを呼ぶにはどうすればいいか。
Perl はこれまた意外な答えを持っている。

オブジェクトが $object、メソッド名を $method とする。
$object は bless されたリファレンスが入っている。
$method には、文字列でメソッド名が入っている。
$object の $method を呼び出すには以下のように書く。

    $object->$method;

$method は、文字列もしくはコードリファレンスが入った
スカラ変数である必要がある。スカラ変数が文字列の場合、
Perl はオブジェクトと祖先からその名前のメソッドを探し、
それを呼び出してくれる。継承メカニズムが有効なのだ。

因みに、コードリファレンスを使って呼び出しても、
継承を自動的に追いかけてくれるわけではないので、
関数をメソッド風に呼ぶくらいにしか用途はない。

他の高級言語に慣れている人は、メソッド呼び出し記法は、
メソッド名が識別子であるという固定観念がある。
Perl はそんなことは気にしないのだ。

さらに上記の $object が文字列の場合は、
クラスメソッドとしての呼び出しとなる。
また、後ろに括弧を書くことで、引数も指定可能だ。

    my $package     = 'Employee';
    my $constructor = 'new';
    my $method      = 'set_salary';

    my $object = $package->$constructor;
    $object->$method(200000);

不思議な感じではある。

アロー演算子はデリファレンスだけでなく、
メソッド呼び出しの二つの機能を持つため、
上記はシンボリックリファレンスと混同しやすいが、
アロー演算子の後にスカラ変数がきた場合は、
動的なメソッド呼び出しとして処理されるのだ。



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