難しく考えすぎだよ。リストにハッシュの代わりに配列を使用する場合、 headとlastについて心配する必要はありません。配列の先頭は$array[0]
で、最後のメンバーは$array[-1]
です。シンプルでやりやすい。
リストを定義するための簡単な標準クラス定義を次に示します。コンストラクター (新しいサブルーチン) と 1 つのメソッド (リスト) を定義しただけです。
package Local::List;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
$self->list([]);
}
sub list {
my $self = shift;
my $list_ref = shift;
if (ref $list_ref ne "ARRAY) {
return;
}
if (defined $list_ref) {
$self->{LIST} = $list_ref;
}
if wantarray {
return $self->{LIST};
}
}
まず第一に、他の人が使用するのと同じ標準名を使用してください。コンストラクターに使用new
します。クラスの使用方法に関するドキュメントを見ようとすると、単語newを検索して、それがクラス オブジェクトの作成方法であることがわかります。また、変数名と を使用します。それは他の誰もがしていることなので、何が起こっているのかを知るのは簡単です.$class
$self
new
私のサブルーチンでは、渡された最初の項目はクラスの名前であり、他のサブルーチンに渡された最初の項目はクラス オブジェクト (つまり ) への参照であることに注意してください$self
。それはおそらくクラスについて理解するのが最も難しいことです。
に注目してください。new
私はすぐに my を作成し、$self
それを祝福します。そうすれば、他のサブルーチン (メソッド) を呼び出して設定を行うことができます。このように、私のコンストラクターは私のクラスがどのように構造化されているかを知りません。これには多くの利点があります。
- クラスを変更するとき (変更する場合ではない)、コンストラクターを変更する必要はありません。
- コンストラクターは常にすべてのメソッドと同期しています。
- クラスの定義を開始するときに、クラス オブジェクトがどのように構成されているかを知る必要はありません。クラスがどのように機能するかについての汚い詳細を気にすることなく、クラスを書き始めることができます。
list
サブルーチン (またはメソッド) は、リストを設定するかリストを返すことができることに注意してください。同じサブルーチンを使用して値を設定または取得すると、はるかに簡単になります。メソッド サブルーチンでも、メソッド関数がエラーを返す場合は、空白の return を使用します。それ以外の場合は、常に何かを返します。これにより、メソッドが失敗したかどうかを簡単にテストできます。
おそらく必要と思われる他の方法をいくつか見てみましょう。4 つの標準リスト関数をすべて用意しましょう。
次に例を示します。
sub push {
my $self = shift;
my $member = shift;
if (not defined $member) {
return;
}
my $list_ref = $self->list;
my $return = push @{ $list_ref }, $member;
$self->list($list_ref);
return $return;
}
うわー、それは簡単です。pop
は私のクラスがどのように見えるかを知らないことに注意してください。メソッドを使用list
して、リスト参照を取得しました。次に、組み込みpush
メソッドを使用してメンバーをリストにプッシュしました。その戻り値を保存し、それを返します。push
何が返ってくるのかもわかりません。私が知っているのは、プッシュが成功した場合に何かを返すということだけです。(はい、リスト内のアイテムの数を返すことは知っています)。
他の 3 つの機能はほぼ同じです。さらにいくつかの例を次に示します。
currentに対して行う必要があるのは、現在の値を保存することだけです。同じ関数を使用して値を設定および取得します。私のlist
メソッドまたは私のpush
メソッド、または私のnew
コンストラクターは、あなたがそれをどのように格納するかを知っているか、気にかけていることに注意してください。また、私たちのnext
andprevious
メソッドもそうではありません。メソッド サブルーチンcurrent
を使用して値をインクリメントまたはデクリメントし、元に戻すだけです。current
sub next {
my $self = shift
my @list = $self->list; #Returns a list;
my $current = $self->current;
my $list_size = $#list;
if ($current eq $list_size) {
return; #Can't return a value after the end of the list!
}
$current++; #Increment the value;
my $value = $list[$current]; #I'll return this
$self->current($current) #Store the new current
return $value;
}
そして、あなたの質問の基礎に:リストの最後の値と先頭の値を取得します。ここが最後
sub last {
my $self = shift;
my $list_ref = $self->list;
return ${ $list_ref }[-1];
}
そして、簡単なコピーと貼り付けで頭が痛くなります:
sub head {
my $self = shift;
my $list_ref = $self->list;
return ${ $list_ref }[0];
}
それでおしまい!あなたがしていた心配はすべて無駄でした。
長い投稿で申し訳ありません。強調したいのは、Perl でのオブジェクト指向プログラミングは、いくつかの簡単なガイドラインに従えば、それほど難しいものではないということです。
(単純?use Moose;
いいえ、私は単純だと言いました!)。;-)