に固執、それを行う必要はありませんので
my $new_object = $existing_obj->new;
代わりの
my $new_object = new Classname;
:ref($pkg)||$pkg
はあなたがこれを行うことができること
メソッドを呼び出すと、オブジェクト自体がシーンの裏に渡されます。サブクラスがblessを使用する場合は、コンストラクタであり、代わりにクラス名が渡されます。したがって、どのメソッドも、オブジェクトまたはクラス名を最初の引数として受け取ることになります。残りはメソッドに明示的に渡される引数です。
あなたはハッシュリファレンス{...}
、スカラは何かを渡します。したがって、 "quitely"というクラス名が$pkg
に割り当てられている場合は、$input
に割り当てられます。
ハッシュ参照して、そのインターフェイスのコンストラクタは、最も通例単に最後に評価文のリターンが返されるのでreturn
を省略してもよい
sub new {
my ($class, $input) = @_;
my $self = { %$input };
return bless $self, $class;
}
として書き込まれます。最後の2行は単にreturn bless { %$input }, $class;
と書くことができ、(匿名の)ハッシュリファレンスは初期化され、パッケージ$class
に祝福され(オブジェクトなので)返されます。
しかし、通常は引数を処理する必要があります。 1つは、はである必要があります。クラスがサポートしているものに準拠していることを確認し、ユーザが渡したキーを属性に盲目的に割り当てるだけではありません。必要に応じて値を確認するなどしてデフォルト値を設定します。
このデータの初期化は、別のサブルーチンに分割されることがあります。new
に$self
が更新されるように、コードが参照を介して、「バック」を書き込む例えば
sub new {
my ($class, $input) = @_;
my $self = {};
bless $self, $class; # $self is an object now
$self->_init($input); # on which methods can be called
return $self;
}
sub _init {
my ($self, $args) = @_;
# Check arguments, work out defaults (etc),
# then assign to self as appropriate
%$self = %$args;
}
。
これは "通常の" 呼び出しに
my $new_obj = P_module->new({key => 'abc', other => '...'});
として使用されず間接表記new P_module
されるべきです。慣習的にnew
と呼ばれるコンストラクタは、bless
ハッシュリファレンス(オブジェクトの代わりにクラス名が渡される)がそのパッケージを "認識"してオブジェクトであるため、通常のサブスペシャルです。
文章:perlmod(クラスはパッケージです)、チュートリアルperlootut、および参照perlobjです。
Perlに組み込まれたオブジェクト指向の機能に慣れたら、私がやることをお勧めします。このすべてを(そしてはるかに)簡単にするモジュールがたくさんあります。
最初にお勧めするのは、非常に現代的なMooseとその軽量対応品Mooです。
ありがとうございます。それは非常に有用な説明でした:) –