Доступ к объекту внутри объекта? (Perl) - PullRequest
1 голос
/ 11 октября 2011

Я довольно новичок в Perl. У меня есть объект SomeItem, который содержит массив InnerObjects, для которого я хочу вызвать метод "foo".

foreach $obj (@ { $self->{InnerObjects} }) {
   $obj->foo();
}

Это не работает. Вот ошибка, которую я получаю:

Невозможно вызвать метод "foo" без ссылки на пакет или объект

Класс InnerObject находится в том же файле, что и SomeItem, и предпочел бы сохранить его таким образом, если это возможно, так как я могу получить доступ к классу / пакету InnerObject из класса / пакета SomeItem?

Вот как я объявляю массив в конструкторе:

$self->{InnerObjects} = [];

и установите его:

sub set {
   my ($self, @items) = @_;
   @{ $self->{InnerObjects} } = @items;
}

Ответы [ 2 ]

0 голосов
/ 12 октября 2011

Мое решение проблемы закончилось созданием хэша, который содержал идентификатор SomeItem, который указывает на ссылку на массив InnerObjects.Этот хеш создается манипулирующим классом, таким как

%SomeItemInnerObjects;     # Hash of SomeItem IDs=>InnerObject array references
$SomeItemInnerObjects{ $currentSomeItem->{ID} } = \@myInnerObjects;

и используется следующим образом:

foreach $item (@{ $SomeItemInnerObjects{$currentSomeItem->{ID} } }) {
    # item is an InnerObject 
    $item->foo($currentSomeItem->{ID});
}

Так что SomeItem больше не содержит InnerObjectsЯ знаю, что это не отвечает на вопрос как таковой, но представляет альтернативное решение.

0 голосов
/ 11 октября 2011

Ваш код пока выглядит законным. Поэтому ошибка МОЖЕТ быть в данных, переданных в set().

Пожалуйста, добавьте следующее, чтобы установить код:

sub set {
   my ($self, @items) = @_;
   @{ $self->{InnerObjects} } = @items;
   print "OBJECT To work on: " . ref($self) . "\n";
   print "TOTAL objects passed: " . scalar(@items) . "\n";
   foreach my $obj (@items) { print "REF: " . ref($obj) . "\n" };
}

Это покажет, сколько объектов вы передали и действительно ли они являются объектами правильного класса (ref должен напечатать имя класса)

Кроме того, имейте в виду, что @{ $self->{InnerObjects} } = @items; копирует массив массива ссылок на объекты вместо сохранения ссылки на исходный массив @items - это вообще НЕ причина вашей проблемы, но заставляет вас в основном выделить 2 массива вместо одного. Не является большой проблемой в управлении памятью, если массив не очень большой, но все еще расточительный (массив @items необходимо будет собрать после сборки set()).

Я прошу прощения за то, что поместил то, что по сути было комментарием, в качестве ответа, но оно слишком велико, чтобы быть комментарием.

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