Perl: построение массива объектов


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

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

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

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 для чтения содержимого структуры после этого? (Да, яужасно новичок в Ооперле...)

4 4

4 ответа:

Есть Более Чем Один Краткий Способ Сделать Это:

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

my @objects = ();
push @objects, new MyPackage::MyObject() for 1..$N;

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

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

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

push(@objects, 
  new MyPackage::MyObject(), 
  new MyPackage::MyObject(), 
  new MyPackage::MyObject());
Это возможно потому, что прототипом push является push ARRAY,LIST.

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

my @objects = (
  new MyPackage::MyObject(), 
  new MyPackage::MyObject(), 
  new MyPackage::MyObject(),
);

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

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