你在想這件事。如果你使用一個數組作爲你的列表而不是哈希,你不需要擔心頭和上一個。數組的頭部是$array[0]
,最後一個成員是$array[-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
作爲的構造函數。當我嘗試查看關於如何使用您的課程的文檔時,我可以搜索單詞新的,並知道這是我創建類對象的方式。此外,使用變量名稱$class
和$self
。這就是其他人所做的,因此很容易知道發生了什麼。
請注意,在我的new
子例程中,傳遞的第一項是類的名稱,而傳遞給其他子例程的第一項是對我的類對象(即$self
)的引用。這可能是最難理解的課程。
請注意new
,我立即創建我的$self
並祝福它。這樣,我可以打電話給我的其他子程序(我的方法)爲我做設置。這樣,我的構造函數不知道我的類是如何構造的。這有很多好處:
- 當(不是如果)我修改我的類,我不必修改構造函數。
- 我的構造函數總是與我所有的方法同步。
- 當我開始定義類時,我不必知道我的類對象是如何構造的。我可以開始寫我的課,而不用擔心所有那些關於它如何工作的骯髒細節。
請注意,list
子例程(或方法)可以設置列表或返回列表。如果使用相同的子例程來設置或獲取該值,則更容易。同樣在你的方法子程序中,當你的方法函數返回一個錯誤時使用一個空的返回值。否則,總是返回一些東西。這樣可以很容易地測試以查看某個方法是否失敗。
讓我們來看看其他方法你可能想要的。讓我們所有的四個標準列表功能:
下面是一個例子:
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
返回。我所知道的是,如果成功,推送返回。 (是的,我知道它返回列表中的項目數量)。
其他三個功能大致相同。這裏有幾個:
所有你需要的當前做的是存儲當前值。使用相同的功能來設置和獲取值。請注意,我的list
方法或我的push
方法或我的new
構造函數知道或關心您如何存儲它。也不,我們的next
和previous
方法。他們需要做的是遞增或遞減的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;
怎麼樣不,我說簡單!)。 ;-)
問題解決了。非常感謝!!! –