The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Как объявить/использовать массив как член класса?"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"Как объявить/использовать массив как член класса?"  +/
Сообщение от And (??) on 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;


Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Как объявить/использовать массив как член класса?"  +/
Сообщение от PavelR (ok) on 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};
}

---

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Как объявить/использовать массив как член класса?"  +/
Сообщение от And (??) on 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";

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

5. "Как объявить/использовать массив как член класса?"  +/
Сообщение от PavelR (ok) on 09-Июн-13, 20:08 

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

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

6. "Как объявить/использовать массив как член класса?"  +/
Сообщение от And (??) on 09-Июн-13, 20:47 
Спасибо, за толчок в нужном направлении. Детали нашёл тут: http://perldoc.perl.org/perlreftut.html
Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

3. "Как объявить/использовать массив как член класса?"  +/
Сообщение от And (??) on 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";
}


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "Как объявить/использовать массив как член класса?"  +/
Сообщение от And (??) on 09-Июн-13, 19:06 
Опечатка: ListContainer.pm
Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру