Ruby:对象/类的数组

时间:2013-01-26 01:24:03

标签: ruby arrays object

我不是红宝石专家,这给了我麻烦。但是我将如何在ruby中创建一个对象/类数组呢?如何初始化/声明它?在此先感谢您的帮助。

这是我的课,我想创建一个数组:

class DVD
  attr_accessor :title, :category, :runTime, :year, :price

  def initialize()
    @title = title
    @category = category
    @runTime = runTime
    @year = year
    @price = price
  end
end

3 个答案:

答案 0 :(得分:19)

Ruby是鸭子类型(动态类型) 几乎所有东西都是一个对象,所以你可以将任何对象添加到数组中。例如:

[DVD.new, DVD.new]

将创建一个包含2张DVD的数组。

a = []
a << DVD.new

将DVD添加到阵列中。查看Ruby API for the full list of array functions

顺便说一下,如果要保留DVD类中所有DVD实例的列表,可以使用类变量执行此操作,并在创建新DVD对象时将其添加到该数组中。

class DVD
  @@array = Array.new
  attr_accessor :title, :category, :runTime, :year, :price 

  def self.all_instances
    @@array
  end

  def initialize()
    @title = title
    @category = category
    @runTime = runTime
    @year = year
    @price = price
    @@array << self
  end
end

现在,如果你这样做

DVD.new

您可以获取目前为止创建的所有DVD的列表:

DVD.all_instances

答案 1 :(得分:5)

为了在Ruby中创建一个对象数组:

  1. 创建数组并将其绑定到名称:

    array = []
    
  2. 将对象添加到其中:

    array << DVD.new << DVD.new
    
  3. 您可以随时将任何对象添加到数组中。

    如果您希望有权访问DVD课程的每个实例,那么您可以依赖ObjectSpace

    class << DVD
      def all
        ObjectSpace.each_object(self).entries
      end
    end
    
    dvds = DVD.all
    

    顺便说一下,实例变量没有正确初始化。

    以下方法调用:

    attr_accessor :title, :category, :run_time, :year, :price
    

    自动创建attribute / attribute=实例方法以获取和设置实例变量的值。

    initialize方法,定义如下:

    def initialize
      @title = title
      @category = category
      @run_time = run_time
      @year = year
      @price = price
    end
    

    尽管没有参数,但设置实例变量。实际发生的是:

    1. attribute读者方法称为
    2. 它读取未设置的变量
    3. 返回nil
    4. nil成为变量的值
    5. 您要做的是将变量的值传递给initialize方法:

      def initialize(title, category, run_time, year, price)
        # local variables shadow the reader methods
      
        @title = title
        @category = category
        @run_time = run_time
        @year = year
        @price = price
      end
      
      DVD.new 'Title', :action, 90, 2006, 19.99
      

      此外,如果唯一必需的属性是DVD的标题,那么你可以这样做:

      def initialize(title, attributes = {})
        @title = title
      
        @category = attributes[:category]
        @run_time = attributes[:run_time]
        @year = attributes[:year]
        @price = attributes[:price]
      end
      
      DVD.new 'Second'
      DVD.new 'Third', price: 29.99, year: 2011
      

答案 2 :(得分:4)

many_DVD = Array.new(2){DVD.new}