Perlの勘所4 invocantとbless

第4回となったPerlの備忘録です。リアルではPerlのプログラミング業務が終了しました。

invocantとblessについて

invocant(インボカント)とはパッケージ外からメソッドが呼び出された時に暗黙的にメソッドの第一引数として渡されるパッケージのリファレンスである。
リファレンスとはCでいうところのポインタと同じ、メモリのアドレス情報(参照)とかなり似た性質を持つものである。厳密に言うと全く同一ではないが、似ているものだと認識して差支えない。
bless(ブレス)は、invocantで取得したパッケージのリファレンスとパッケージ内で宣言した変数などを関連付ける時に使用する。
 
以下のコードでは、mainパッケージからStoneパッケージを呼び出す際にblessしている。
コードの挙動としてはmainパッケージの4行目でStoneパッケージのインスタンスを生成し、Stoneパッケージの2行目でinvocantを受け取っている。
Stoneパッケージの7行目でblessする。
そして、mainパッケージの8行目で実際に使用している。

呼び出し元

#!/usr/bin/perl
package main;
use Stone;

$obj = Stone->new("SmokyDog","28");

print ref $obj; #"Stone"を出力
print $obj; #"HASH(0x10b1350)"を出力
print $obj->{'name'}; #"SmokyDog"を出力

呼び出されるパッケージ

package Stone;
my $pkg = shift; #invocant(Stoneパッケージの参照)を受け取る
my $hash= {
    name => shift, #SmokyDogを受け取る
    weight => shift #28を受け取る
};

bless $hash,$pkg;

上記で示したコードだとblessがそれほど重要だという印象を受けないかもしれないが、blessを使用することでソースを短く、簡潔に記述することができるので、可読性が高いソースコードを書く上では重要である。私が携わったPerlのプロジェクトでも、データベースに接続してSQLの発行を担う基底クラスに組み込んで使用した。

参考
Perlオブジェクト指向プログラミング