Perl: построение массива объектов - PullRequest
5 голосов
/ 26 сентября 2011

Частично относится к этому вопросу , но отличается, так как речь идет о вызовах конструктора ...

Я бы хотел создать массив с фиксированным количеством объектов.

Я мог бы сделать это:

my @objects;
push( @objects, new MyPackage::MyObject() );
push( @objects, new MyPackage::MyObject() );
push( @objects, new MyPackage::MyObject() );
# ...

Это несколько уродливых видов. Делать это циклом только немного лучше.

Нет ли способа создать массив (инициализированных конструктором) объектов в Perl?

Задний вопрос:

Эти «объекты», которые я хочу создать, на самом деле являются сгенерированными SWIG оболочками для структур C, то есть структур данных без «поведения» (кроме сгенерированных SWIG функций get и set). Я просто хочу передать массив в качестве параметра функции C, которая заполнит структуры для меня; нужно ли для вызова конструкторов вообще, или есть ярлык для использования функций get для чтения содержимого структуры впоследствии? (Да, я ужасно новичок в OOPerl ...)

Ответы [ 4 ]

8 голосов
/ 26 сентября 2011

Существует несколько кратких способов сделать это:

my @objects = map { new MyPackage::MyObject() } 1..$N;

my @objects = ();
push @objects, new MyPackage::MyObject() for 1..$N;
1 голос
/ 26 сентября 2011

Можно сказать

@objects = (new MyPackage::MyObject(), new MyPackage::MyObject(), new MyPackage::MyObject());   
1 голос
/ 26 сентября 2011

Вы можете избежать цикла и повторения одного и того же оператора, указав несколько аргументов для push:

push(@objects, 
  new MyPackage::MyObject(), 
  new MyPackage::MyObject(), 
  new MyPackage::MyObject());

Это возможно, поскольку прототип push равен push ARRAY,LIST.

Или вы можете сделать это более простым способом с помощью компоновщика массива (предпочтительно):

my @objects = (
  new MyPackage::MyObject(), 
  new MyPackage::MyObject(), 
  new MyPackage::MyObject(),
);
0 голосов
/ 26 сентября 2011

Вы можете создать список объектов и присвоить его вашему массиву:

my @objects= (
  new MyPackage::MyObject(),
  new MyPackage::MyObject(),
  new MyPackage::MyObject(), 
  # ...
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...