Как я могу использовать Class :: ArrayObjects? - PullRequest
3 голосов
/ 03 марта 2009

Я написал простую программу, использующую Class :: ArrayObjects , но она не сработала, как я ожидал. Программа:

TestArrayObject.pm:

package TestArrayObject;
use Class::ArrayObjects define => { 
                       fields  => [qw(name id address)], 
                   };

sub new {
    my ($class) = @_;
    my $self = [];
    bless $self, $class;
    $self->[name] = '';
    $self->[id] = '';
    $self->[address] = '';
    return $self;
}
1;

Test.pl

use TestArrayObject;
use Data::Dumper;

my $test = new TestArrayObject;
$test->[name] = 'Minh';
$test->[id] = '123456';
$test->[address] = 'HN';
print Dumper $test;

Когда я запускаю Test.pl, выходные данные:

$VAR1 = bless( [
             'HN',
             '',
             ''
           ], 'TestArrayObject' );

Интересно, где мои данные для «name» и «id»?

Спасибо, Мин.

Ответы [ 2 ]

9 голосов
/ 03 марта 2009

Всегда используйте use strict. Попробуйте использовать use warnings как можно чаще.

Если use strict ваш тестовый скрипт даже не запустится, Perl выдаст следующие сообщения об ошибках:

Bareword "name" not allowed while "strict subs" in use at test.pl line 8.
Bareword "id" not allowed while "strict subs" in use at test.pl line 9.
Bareword "address" not allowed while "strict subs" in use at test.pl line 10.
Execution of test.pl aborted due to compilation errors.

Это потому, что имена ваших индексов массивов видны только вашему модулю TestArrayObject, но не скрипту тестирования.

Чтобы сохранить объектный объектно-ориентированным, я предлагаю вам реализовать средства доступа для ваших переменных, такие как get_name / set_name, и использовать эти средства доступа вне модуля вашего класса.

0 голосов
/ 03 марта 2009

Из комментария Манни я сделал некоторые изменения в моей программе, как показано ниже:

TestArrayObject.pm:

package TestArrayObject;
use strict;
use Class::ArrayObjects define => {
                                  fields  => [qw(name id address)],
                                };
sub new {
    my ($class) = @_;
    my $self = [];
    bless $self, $class;    
    return $self;
}

sub Name {
    my $self = shift;
    $self->[name] = shift if @_;
    return $self->[name];
}

sub Id {
    my $self = shift;
    $self->[id] = shift if @_;
    return $self->[id];
}

sub Address {
    my $self = shift;
    $self->[address] = shift if @_;
    return $self->[address];
}

1;

==> Я добавил метод get / set для доступа к внутреннему объекту массива.

Test.pl:

use strict;
use TestArrayObject;
use Data::Dumper;

my $test = new TestArrayObject;
$test->Name('Minh');
$test->Id('123456');
$test->Address('HN');
print Dumper $test;

И окончательный вывод:

$VAR1 = bless( [
             'Minh',
             '123456',
             'HN'
           ], 'TestArrayObject' );

Это именно то, что я ожидал.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...