- Perl ›
- オブジェクト指向プログラミング ›
- here
コンストラクタ
コンストラクタを作成してみましょう。Perlでは、コンストラクタとは、クラスを元にしてオブジェクトを生成するクラスメソッドのことです。コンストラクタ用の特別な構文はなくnew
という名前でコンストラクタを作成するのが一般的です。
コンストラクタのひな形
以下がコンストラクタのひな形になります。
package Point; sub new { my $class = shift; # オブジェクトの生成 my $self = bless {@_}, $class; # 初期化処理 return $self; }
オブジェクトの生成
コンストラクタを作成するとオブジェクトを生成できるようになります。
# オブジェクトの生成 my $point = Point->new;
初期化処理
コンストラクタでの初期化処理は以下のように書きます。
sub new { my $class = shift; # オブジェクトの生成 my $self = bless {@_}, $class; $self->{x} //= 0; $self->{y} //= 0; return $self; }
//演算子を使って初期化しています。
コンストラクタの実装
コンストラクタの実装の解説です。
sub new { my $class = shift; # オブジェクトの生成 my $self = bless {@_}, $class; # 初期化処理 return $self; }
コンストラクタはクラスメソッド
コンストラクタはクラスメソッドです。shift関数で引数 @_の先頭を取り出します。
sub new { my $class = shift; # ... }
$class
には、今回の例では、Point
が代入されます。
bless関数でオブジェクトを生成
bless関数でオブジェクトを生成します。
sub new { # ... # オブジェクトの生成 my $self = bless {@_}, $class; # ... }
bless関数は、第一引数で指定されたデータに、第二引数で指定されたクラスを結び付けます。戻り値で、第一引数に指定されたデータを返します。これは、オブジェクトになっています。
第一引数は、リファレンスである必要があります。配列のリファレンスやスカラのリファレンスも利用できますが、標準的な用途では、ハッシュリファレンスが使われます。
Perlにおけるオブジェクトとは?
Perlにおけるオブジェクトとは、bless関数によって、クラスに紐づけられたデータです。
コンストラクタのカスタマイズ
ハッシュのリファレンスも受け入れたい
コンストラクタで、ハッシュのリファレンスも受け入れたい場合は、コンストラクタを以下のように書きます。
package Point; sub new { my $class = shift; # オブジェクトの生成 my $self = bless ref $_[0] ? {%{$_[0]} : {@_}, $class; # 初期化処理 return $self; } my $point = Point->new({x => 1, y => 2});
第1引数がハッシュリファレンスだった場合は、デリファレンスします。
オブジェクトからnewを呼び出したい
クラス名からではなく、オブジェクトからもnewを呼び出したい場合は、次のように書きます。ref関数でオブジェクトからクラス名を取得することができます。
sub new { my $class = shift; # オブジェクトの生成 my $self = bless {@_}, ref $class || $class; # 初期化処理 return $self; }
データを配列のリファレンスにしたい
データを配列のリファレンスにすることもできます。
sub new { my $class = shift; # データを配列のリファレンスにする my $self = bless [@_], $class; # 初期化処理 return $self; }
ただし、このクラスは、配列以外のデータを保存できないことに注意してください。