【问题标题】:Perl: Constructing an array of objectsPerl:构造对象数组
【发布时间】: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 的新手......)

【问题讨论】:

    标签: perl oop swig


    【解决方案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(), 
          # ...
        );
        

        【讨论】:

          猜你喜欢
          • 2016-10-18
          • 2014-11-19
          • 1970-01-01
          • 2012-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-13
          • 2022-08-19
          相关资源
          最近更新 更多