URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9690
[ Назад ]

Исходное сообщение
"Как объявить/использовать массив как член класса?"

Отправлено And , 09-Июн-13 13:16 
Какой синтаксис при использовании массива как члена класса? Объявить, присваивать значение, возвращать и т.д. Ниже заготовка. Например, как это сделать в ней?


#!/usr/bin/perl -w

package PackClass;

sub new {
    my $self = [];

    $self->{@pack} = ("asd", "fgh");

    bless($self);
    return $self;
}

sub setPack {
    my $self = shift;
    my $index = shift;
    if (@_) { $self->{@pack[index]} = shift }
    return $self->{@pack[index]};
}

sub getPack {
    my $self = shift;
    return $self->{@pack};
}

1;



Содержание

Сообщения в этом обсуждении
"Как объявить/использовать массив как член класса?"
Отправлено PavelR , 09-Июн-13 17:44 

Я бы предложил переделать так:

package PackClass;

sub new {
    my $self = {};

    $self->{_RequiredArrayAttributeName} = \("asd", "fgh"); #ARRAYREF
    $self->{_SomeOtherAttributeName} = 42;
    ...

    bless($self);
    return $self;
}

sub setPack {
    my $self = shift;
    my $index = shift;
    if (@_) { @{$self->{_RequiredArrayAttributeName}}[index] = shift }
    return @{$self->{_RequiredArrayAttributeName}}[index];
}

sub getPack {
    my $self = shift;
    return @{$self->{_RequiredArrayAttributeName}};
}

альтернативный вариант:
sub getPack {  #ARRAYREF
    my $self = shift;
    return $self->{_RequiredArrayAttributeName};
}

---

А то что вы привели, это чуть другое.


"Как объявить/использовать массив как член класса?"
Отправлено And , 09-Июн-13 18:59 
Ответ на это:

sub getPack {
    my $self = shift;
    return @{$self->{_RequiredArrayAttributeName}};
}

Конкретно на строчку
    return @{$self->{_RequiredArrayAttributeName}};
ругается:
    Not an ARRAY reference at PackClass.pm line ...

Что неправильно? Код доступен по ссылке:
    Сам класс только: http://pastebin.com/xzQJCbGU
    Использование класса: http://pastebin.com/e6Y7sAL6


С альтернативным вариантом - getPackAlternativeImplementation - ок.

Как получить доступ к отдельным элементам массива theArray, используя значение, возвращаемое getPackAlternativeImplementation()? Например, как-то так, но правильно:

my $justPacket = new PackClass();
my @theArray = $justPacket->getPack();
print $Array[0] . "\n";
print $Array[1] . "\n";


"Как объявить/использовать массив как член класса?"
Отправлено PavelR , 09-Июн-13 20:08 

Везде работать не с массивом, а с указателем на массив.

my $justPacket = new PackClass();
my $theArrayRef = $justPacket->getPack();  #Should return ARRAYREF.
print $theArrayRef[0] . "\n";
print $theArrayRef[1] . "\n";


"Как объявить/использовать массив как член класса?"
Отправлено And , 09-Июн-13 20:47 
Спасибо, за толчок в нужном направлении. Детали нашёл тут: http://perldoc.perl.org/perlreftut.html

"Как объявить/использовать массив как член класса?"
Отправлено And , 09-Июн-13 19:05 
По мотивам http://stackoverflow.com/questions/2561451/how-do-i-use-an-a...
сделал свой вариант. Критика приветствуется.

Сам класс, файл "ListContaine.pm"


#!/usr/bin/perl

use strict;
use warnings;

package ListContainer;

sub new {
    my $class = shift;
    my $self = {
        sftVersion => shift,
        softwareSynonyms => [@_],
    };

    bless $self, $class;
    return $self;
}

sub setSynonyms {
    my ( $self, @newSoftwareSynonyms ) = @_;
    $self->{softwareSynonyms} = \@newSoftwareSynonyms;
}

sub addSynonym {
    my ( $self, $newSoftwareSynonym ) = @_;
    push($self->{softwareSynonyms}, $newSoftwareSynonym);
}

sub getSynonyms {
    my( $self ) = @_;
    return @{$self->{softwareSynonyms}} ;
}

1;

Пользоваться так - файл "launcher.pl":


#!/usr/bin/perl

use strict;
use warnings;

use File::Basename;
use lib dirname(__FILE__);

use ListContainer;

my @namesToBeInsertedInPlace = (
        "sft First",
        "sft Second",
        );

my $justPacket = new ListContainer("MajorName", "name Tenth", "name Eleventh", "name Twelfth");

$justPacket->setSynonyms(@namesToBeInsertedInPlace);
$justPacket->addSynonym("Yet Another One");

my @theArray = $justPacket->getSynonyms();

print "Second element is:" . $theArray[1] . "\n";

print "Have " . ($#theArray + 1) . " members in the list:\n" ;

foreach my $singleName (@theArray) {
    print ":\t" . $singleName . "\n";
}



"Как объявить/использовать массив как член класса?"
Отправлено And , 09-Июн-13 19:06 
Опечатка: ListContainer.pm