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