読者です 読者をやめる 読者になる 読者になる

さわだのノート

書籍のお仕事に役立つかもしれない思いつきを記録しています。

RSS: 記事の更新情報 Rss Feed

Perlのオブジェクト指向プログラミングで、インスタンスにデフォルト値を設定する

そういえばPerlオブジェクト指向プログラミングするとき、インスタンスのデフォルト値ってどうやって設定するんだろうと思って調べてみた。どうやらデフォルト値を設定したハッシュと、コンストラクタの引数として受け取ったハッシュをマージして、そいつにblessしてやればいいみたい。

package Person {
    use strict;
    use warnings;
    use utf8;

    # ここでデフォルト値を設定
    my %def = (foo => 'Sawada', bar => 'Takehiro');

    use Class::Accessor::Lite (
        new => 0, # newを自前で作るなら0
        rw  => [qw/foo bar/],
    );


    sub new {
        my $class = shift;
        my $args = ref $_[0] ? $_[0] : +{@_};
        # ハッシュをマージしてデフォルト値を上書き
        bless {%def, %$args}, $class;
    }

    1;
}

package main {
    use v5.18;
    use warnings;
    use utf8;

    my $use = Person->new(foo => 'Tanaka');
    printf "Family Name : %s", $use->foo();
    printf "First Name  : %s", $use->bar();
}

実行結果。インスタンス作成時に渡した「foo」の値だけ上書きされている。

Family Name : Tanaka
First Name  : Takehiro