Perl:构造对象数组

Posted

技术标签:

【中文标题】Perl:构造对象数组【英文标题】:Perl: Constructing an array of objects 【发布时间】:2011-09-26 15:21:12 【问题描述】:

与this question 部分相关但不同,因为这是关于构造函数调用...

我想创建一个包含固定数量对象的数组。

我可以这样做:

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

那是几种丑陋的。让它成为一个循环只会稍微好一点。

难道没有办法在 Perl 中创建一个(构造函数初始化的)对象数组吗?

事后思考的问题:

我想要创建的这些“对象”实际上是 SWIG 生成的 C 结构包装器,即没有“行为”的数据结构(除了 SWIG 生成的 getset 函数)。我只想将数组作为参数传递给 C 函数,它将为我填充结构;我是否需要 调用构造函数,或者是否有一个捷径可以让get 函数在之后读取结构内容? (是的,我非常是 OOPerl 的新手......)

【问题讨论】:

【参考方案1】:

有不止一种简洁的方法:

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

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

【讨论】:

我只是喜欢第一个答案,永远不会想到这一点。 我投了赞成票,因为我也会使用map,但是在间接对象语法MyPackage::MyObject0->new() 上的嘘声要好得多,另一种方式会带来很多歧义。 事实上,他们正在讨论在未来版本readwriteweb.com/hack/2011/09/…第271帧中删除间接对象语法。另见perldoc perlobj 第一个解决方案是纯粹的美,正是我希望找到的。 @Joel Berger:感谢您的提示,我从没想过看起来如此熟悉的 new ... 语法在 Perl 中有脚洞。【参考方案2】:

你可以说

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

【讨论】:

【参考方案3】:

您可以通过向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(),
);

【讨论】:

【参考方案4】:

您可以构造一个对象列表并将其分配给您的数组:

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

【讨论】:

以上是关于Perl:构造对象数组的主要内容,如果未能解决你的问题,请参考以下文章

23-Perl 面向对象

GWA2-Perl的面向对象方法中数组或哈希列表参数传递问题

C++对象数组与对象指针

在c++中如何调用数组对象的构造函数

浅谈Perl的类包模块与面对对象编程

堆数组中对象的构造函数[重复]