これまで私は常にクラスの変数の順序に頼っていましたが、今はそれらの変数をシャッフルされた順序で初期化しようとしています。オブジェクトの作成中に特定のクラス変数を初期化する方法はありますか?
たとえば、これは私が通常オブジェクトを作成するときに行うことです。
my $person1 = Person->new ('Fernando', 'Alonso', 36);
これは私が達成しようとしているものです。
my $person2 = Person->new (Age => 36, FistName => 'Fernando', LastName => 'Alonso');
私は私が見たが、彼らは私に完全な例を返しませんでしたいくつかの文書(例えばperldoc)に係る=>
を試してみました。しかし、私は実際に次のスクリプトで作業していません。それは 'cliché'パッケージPerson
を持つ公正なMCVEです。
use strict;
use warnings;
package Person;
sub new {
my $class = shift;
my $self = {
FirstName => shift,
LastName => shift,
Age => shift,
};
print "First name : $self->{FirstName}\n";
print "Last name : $self->{LastName}\n";
print "Age : $self->{Age}\n\n";
bless $self, $class;
return $self;
}
# Works well
my $person1 = Person->new ('Fernando', 'Alonso', 36);
# (?) How to assign 36 directly to $self->{Age}
my $person2 = Person->new (Age => 36, '', '');
出力は次のとおりです。
First name : Fernando
Last name : Alonso
Age : 36
First name : Age
Last name : 36
Age :
したがって、クラス変数への明示的な割り当てを行うためにオブジェクトを作成する方法を教えてください。必要に応じて、パッケージPerson
をどのように変更する必要がありますか?
P.S.オブジェクトの作成後に変数を変更することは避けてください。
のすべてを指定されていません...あなたがタイプミスに対して弾力的になりたい場合は、 '$を削除することができ、デフォルト値を提供することができあなたが後で '(@ @/@キーを@ソートキー%args){croak" Unknown named arguments:@unknown "のような未使用のargsをチェックすることができるように、' args {$ key} '' } ' – amon
私は両方のソリューションを試して、どちらも完璧に動作しました。 – ahmedus
'my $ self = {@_}'は抽象を破ります。私はあなたが少なくともそれが望ましくないとマークするべきだと思います。 – Borodin