下記はクラス MyClass
のコンストラクタを定義するサンプルです。
{
package MyClass;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
}
}
実際にこのクラスのインスタンスを作成するときは下記のように実行します。
my $obj = MyClass->new;
Perl では、あるリファレンス変数をクラス名に対して bless (祝福)すると、そのリファレンス変数はそのクラスのインスタンスになります。 リファレンス変数はどんな変数のリファレンスでも構いませんが、多くの場合 はハッシュ変数のリファレンスを用いて、インスタンス変数などをハッシュで管理できるようにします。
my $ref = {};
bless $ref, 'MyClass'; # $ref は MyClass クラスのインスタンスになる
上記のように MyClass
という名前で bless されたリファレンス変数 $ref
を使って、
$ref->greet(@params);
とすると、MyClass
パッケージの greet
メソッドが呼び出されるようになります。
上記のように矢印を使った呼び出しは、あたかも以下のように MyClass
パッケージのメソッドを呼び出したのと同じように振舞います。
MyClass::greet($ref, @params);
あるパッケージ内のサブルーチンで、そのパッケージ名に対して bless したリファレンスを返すようにすれば、そのサブルーチンはコンストラクタとして使用できるようになります。
MyClass->hoge();
のようにクラスメソッドを呼び出した場合に、暗黙的に第 1 引数でクラス名 MyClass
が渡されることを利用して、パッケージ名をクラス名とみなして bless することができます。
C++ や Java と違い、コンストラクタの名前は new
でなくても構いません。
{
package MyClass;
sub new {
my $class = shift; # MyClass->new; と呼び出した場合 $class は 'MyClass' となる
my $self = {}; # 何のリファレンスでも構わない
bless $self, $class; # $ref はインスタンスとなる
$self;
}
}
bless
演算子は、便宜的に bless したリファレンスを返すようになっているので、上記のような単純なコンストラクタは次のように簡略化して記述できます。
sub new {
bless {}, shift;
}
bless した後にいろいろ初期化処理を行う場合は、最後の行に $self
とだけ記述しておくのを忘れないようにしてください。