你在想这件事。如果你使用一个数组作为你的列表而不是哈希,你不需要担心头和上一个。数组的头部是$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;
怎么样不,我说简单!)。 ;-)
问题解决了。非常感谢!!! –