2009-03-03 5 views
3

J'ai écrit un programme simple qui utilise Class::ArrayObjects mais cela n'a pas fonctionné comme je m'y attendais. Le programme est le suivant:Comment utiliser 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; 

Quand je lance Test.pl, les données de sortie est:

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

I demande-moi où sont mes données pour 'nom' et 'id'?

Merci, Minh.

Répondre

9

Toujours utilisez use strict. Essayez d'utiliser use warnings aussi souvent que possible.

Avec use strict votre script de test ne fonctionne pas, même, Perl émettra les messages d'erreur suivants à la place:

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. 

C'est parce que les noms de vos tableaux indices ne sont visibles que sur votre module TestArrayObject, mais pas le script de test. Pour garder votre classe orientée objet, je vous suggère de mettre en œuvre des accesseurs pour vos variables, telles que get_name/set_name et d'utiliser ces accesseurs de l'extérieur de votre module de classe.

0

Du commentaire de Manni, je l'ai fait quelques changements dans mon programme comme ci-dessous:

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; 

==> Je glissai méthode get/set pour accéder à un objet tableau interne .

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; 

Et la sortie finale est:

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

Il est exactement ce que je pensais.

Merci.

+0

Vous pouvez enregistrer des lignes de code et des erreurs de gestion lors de l'écriture du générateur de méthodes 'BEGIN {for (qw (nom adresse de l'identifiant)) {no strict 'refs'; mon $ no = &$_; * {ucfirst()} = sub {mon $ self = shift; $ self -> [$ no] = shift si @_; return $ self -> [$ no];};}} ' –

+0

Quoi qu'il en soit, je n'aime pas obtenir/définir et recommander en utilisant get et set séparés. 'BEGIN {for (qw (nom de l'adresse id)) {no strict 'refs'; my $ no = &$_; mon $ name = ucfirst; * {"get $ name"} = sub {shift -> [$ non]}; * {"set $ name"} = sub {$ _ [0] -> [$ no] = $ _ [1]};}} ' –

+0

Oui, je suis d'accord avec vous sur l'utilisation de get/set. Cela rend le code plus OO. –