1. Perl
  2. オブジェクト指向プログラミング
  3. 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;
}

ただし、このクラスは、配列以外のデータを保存できないことに注意してください。

業務に役立つPerl

Perlテキスト処理のエッセンス

PerlでポータブルなLinuxファイル管理入門

ITエンジニアの求人情報など

 ITエンジニアの求人情報・Webサービス・ソフトウェア・スクールなどの情報。

システム開発のお問い合わせ