-8

これはオブジェクト指向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";
}

どこが間違っているのですか?

4

1 に答える 1

1

Ok。使用しているオブジェクトコンストラクタの構文は少し厄介です。

my $obj = Stats->new(13,4,56,43,33);

Perlでは、newは通常のキーワードではなく、単純なサブであり、そのように使用する必要があります。Foo->sub(@args)構文はとまったく同じであるため、Foo::sub('Foo', @args)正しいクラス名を渡し、正しいnewsubを呼び出すことができます。

次に、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
于 2012-10-01T06:22:20.637 に答える