【问题标题】:How to create array of objects?如何创建对象数组?
【发布时间】:2013-11-25 04:22:47
【问题描述】:

如何像下面的 C++ 示例一样创建对象数组?

Print print[1000]; 的 Ruby 方式是什么?

下面的代码是 C++。我只是想知道 Ruby 是否可以选择实例化一个类的 1000 个唯一对象:

class Print
{

public:
    Print()
    {
        static int count = 0;
        cout<<"h"<<++count<<endl;
    }
};

int main()
{    
    Print print[1000];
    getchar();
    return 0;
}

【问题讨论】:

  • 这不是C++吗?如果不是很有趣
  • @Hanky웃Panky 我通过该程序作为打印 1000 个字符而无需循环或递归的解决方案。
  • 我想count 是一个全局变量,输出看起来像:“h0 h1 h2 h3”...?
  • @ThomasW 是的,它应该是这样的
  • @Shiva 是 C++,而不是 Ruby。如果您想使用 Ruby,您正在查看错误的代码

标签: ruby arrays object


【解决方案1】:

要实例化一个字符串的 1000 个副本,我们可以这样做:

collection_of_strings = Array.new(1000, String.new('h'))
print collection_of_strings

这是存储在数组中的同一个对象。然后打印出那个数组。

这种带有给定块的 Array.new 形式将创建一个单独实例化的对象,无论您为参数提供多少次:

>> collection = Array.new(10) {String.new}   
=> ["", "", "", "", "", "", "", "", "", ""] 

并通过检查数组中每个对象的object_id 来证明。

>> collection.each {|e| puts e.object_id}    
85621980                                     
85621970                                     
85621960                                     
85621950                                     
85621940                                     
85621930                                     
85621920                                     
85621910                                     
85621900                                     
85621890                                     
=> ["", "", "", "", "", "", "", "", "", ""]  

【讨论】:

  • 谢谢,这可行,但似乎 initialize 只被调用一次
  • 嗯...你是对的。此表单适用于单独唯一的对象...(已编辑)
  • 谢谢Array.new(10) {String.new} 是我正在寻找的
【解决方案2】:

鉴于此

“我想count是一个全局变量,输出看起来像:“h0 h1 h2 h3”

以下应该可以工作(有关详细信息,请参阅Array#new 块 [1])。它不需要外部变量,块被传递数组的索引:

Array.new(1000) {|count| "h#{count}"}

要将它们全部放在一个字符串中,请尝试:

Array.new(1000) {|count| "h#{count}"}.join(' ')

[1]http://ruby-doc.org/core-2.0.0/Array.html#method-c-new

【讨论】:

    【解决方案3】:

    ThomasW 的替代答案:

    output = []
    1000.times do |i| { output << "h#{i}" }
    

    【讨论】:

      【解决方案4】:

      是的,有!在将您的 C++ 翻译成 Ruby 时,这是我想出的:

      #create dummy class
      class Kraken
        # equivalent to your C++ static variable which I think
        # should be declared outside the constructor
        @@count = 0
      
        # increment the count class variable on every 
        def initialize
          @@count = @@count + 1
        end
      end
      
      # Release the Kraken!
      kraken = Array.new(1000) { Kraken.new }
      

      【讨论】:

      • 谢谢@Yasky 但是 C++ 程序的唯一目的是在没有循环或 recursion 的情况下打印。所以在你看来 Array.new(1000){Kraken.new} 应该没问题
      • @shiva: Array.new(1000){Kraken.new} 包含一个隐式循环(特别是在 MRI 中,for (i=0; i&lt;len; i++) { rb_ary_store(ary, i, rb_yield(LONG2NUM(i))); ARY_SET_LEN(ary, i + 1); })。在没有某种循环的情况下,在 Ruby(或任何其他语言)中无法做到这一点,就像 C++ 代码在编译为机器代码时会调用构造函数 1000 次一样。
      【解决方案5】:

      要使用 Ruby 获得该输出,您只需执行以下操作:puts (0..999).to_a

      或者,如果你想要 'h's,你可以这样做:(0..999).each {|n| puts "h#{n}"}

      【讨论】:

      • 但是解决方案不应该有循环或recursion
      • @shiva:为什么没有循环或递归?您是否要求人们为您做作业?
      • 不,我认为您误解了我的问题,我只是想知道如何在 ruby​​ 中移植确切的解决方案
      • @muistooshort 实际上,如果问题清晰准确,他可以要求人们为他做这项作业:P
      • @Nobita:但应该说这是家庭作业,他们应该对自己在做什么有一个基本的了解(如果是家庭作业则更是如此)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 2020-11-26
      • 2021-02-04
      相关资源
      最近更新 更多