这是来自面向对象的Perl的问题。我应该设计一个模块:
1)存储值
2)计算总数,平均值,计数。
我应该找到一个代码,它与面向对象的Perl中的方法覆盖或多态性或继承有关。
我的代码是这样的:
package Stats;
use strict;
use warnings;
sub new {
my $class = @_;
my $self = {};
bless $self, $class;
$self->clear();
return $self;
}
sub clear {
my $self = $_[0];
$self->{'numlist'} = undef;
$self->{'x_sum'} = 0;
$self->{'x2_sum'} = 0;
}
sub addValue {
my $self = $_[0];
my $num = $_[1];
if (defined $num) {
push @{$self->{'numlist'}}, $num;
$self->{'x_sum'} += $num;
$self->{'x2_sum'} += $num**2;
}
}
sub getTotal {
my $self = $_[0];
return $self->{'x_sum'};
}
sub getMean {
my $self = $_[0];
my @numlist = @{$self->{'numlist'}};
if (!@numlist) { return 0; }
return $self->getTotal()/@numlist;
}
sub getValueList {
my $self = $_[0];
return @{$self->{'numlist'}};
}
1;
sub results {
my $obj = new Stats(13,4,56,43,33);
print "Number of values: ", scalar($obj->getValueList()), "n";
print "Total: ", $obj->getTotal(), "n";
print "Mean: ", $obj->getMean(), "n";
}
我哪里出错了?
好的。您使用的对象构造函数语法有点奇怪,我更喜欢
my $obj = Stats->new(13,4,56,43,33);
在 Perl 中,new
不是一个普通的关键字,而是一个简单的 sub,应该这样使用。Foo->sub(@args)
语法完全等同于Foo::sub('Foo', @args)
,因此负责传递正确的类名和调用正确的new
sub。
然后,您应该使用传递给Stats
构造函数的数字。这个构造函数应该可以做到这一点:
sub new {
my ($class, @args) = @_;
my $self = {};
bless $self, $class;
$self->clear();
$self->addValue($_) foreach @args;
return $self;
}
我将构造函数的所有参数填充到 @args
数组中,然后循环访问它们并将这些值添加到我们的 stats 对象中。
另外,不要忘记实际调用results()
来执行测试。它将打印:
Number of values: 5
Total: 149
Mean: 29.8