コンストラクタに引数を渡せるようにする




  1. Perl




  2. オブジェクト指向



  3. コンストラクタの引数

 今回は、コンストラクタに引数を渡せるようにしてみましょう。

1. コンストラクタに引数を渡す。

 オブジェクトを作成するときは

my $book = Book->new(title => 'Good news', author => 'Kimoto');

という形が理想的です。

 このような機能を持つコンストラクタを作成してみましょう。

sub new {
  my ($class, %args) = @_;
  my $self = {%args};
  return $self, $class;
}

 特に難しい部分はありませんね。

2. ハッシュのリファレンスも受け入れたい

 ハッシュを受け入れられると同時にハッシュのリファレンスも受け入れたいと思うところでしょう。こんな感じに。

my $book = Book->new({title => 'Good news', author => 'Kimoto'});

 対応できるコンストラクタは、こんな感じです。

sub new{
    my ($class, @args) = @_;
    my %args = ref $args[0] eq 'HASH' ? %{ $args[0] } : @args;
    my $self = {%args};
    return $self, $class;
}

 第1引数が、ハッシュリファレンスだった場合は、それをデリファレンスしてハッシュに代入しますそうでない場合は、引数をハッシュとして代入します。

3. コンストラクタにデフォルト値を設定したい

 さてさて、コンストラクタに対する要求はまだまだ続きます。値が代入されない場合のデフォルト値を設定したい場合などです。

sub new {
  my ( $class, @args ) = @_;
  my %args = ref $args[0] eq 'HASH' ? %{$args[0]} : @args;
  my $self = {%args};
 
  $self->{title} ||= 'default title';
  $self->{author} ||= 'default author';

  return $self, $class;
}

 以下の部分に注目してください。値が偽値ならば、デフォルト値を代入するという操作をしています。

  $self->{ title } ||= 'default title';
  $self->{ author } ||= 'default author';

 でもこれじゃ、空文字を代入された場合もデフォルト値が設定されてしまいますので、それがまずい場合は、defined 関数を使用して

  $self->{ title } = 'default title' unless defined $self->{ title };

とします。