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 ответа:
Есть Более Чем Один Краткий Способ Сделать Это:
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(), );