オブジェクト下調べ

blessの対象

いろんなところに「オブジェクトとはblessされたリファレンス」と書かれているが,Effective Perl (ASCII Addison Wesley Programming Series)では「bless演算子は引数としてリファレンスを受け取るけれども,そのリファレンスをblessしているのではない.」と書かれている

ふーむ.

プログラミングPerl 改訂版(第2版)にはこう書かれている.

コンストラクタは,単なるサブルーチンで,クラス(一般には,コンストラクタが定義されているクラス)にblessされた「物」へのリファレンスを返す.コンストラクタは組み込みのbless関数を使ってこれを行う.bless関数は,「物」に対して特定のクラスに所属するという印を付ける.
プログラミングPerl 改訂版(第2版) P.332

やはりプログラミングPerl第3版(プログラミングPerl〈VOLUME1〉プログラミングPerl〈VOLUME2〉
)も買った方がいいような気がする.違いがあるなら見てみたい

perlobjには「An Object is Simply a Reference」とある.「オブジェクトは単なるリファレンスである」だろうか.blessの動作はどうあれblessされた物へのリファレンスを返すことを考えればリファレンスそのもの(違う)だろう.

ズバリの絵があった.オブジェクト指向PerlマスタコースのP.109,110.なるほど.やはりリファレンスではなくてリファレンスが指す「モノがbless」されてオブジェクトになる.あくまでリファレンスはリファレンス.refでの区別はわかりやすいかもしれない

2引数のbless

Perlベストプラクティスにも書いてあるが,必ず2引数のblessを使い明示的にblessする対象のパッケージを指定すること.そしてblessの第2引数には「コンストラクタに渡された第1引数のコピー」を指定すること.

package Class;
sub new {
    my $pkg = shift;
    return bless { @_ }, $pkg;
}

書き方は下の方がいいな

package Class;
sub new {
    my ($class, @args) = @_;
    return bless { @args }, $class;
}