14

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

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

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

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

3 回答 3

19

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

[DVD.new, DVD.new]

将创建一个包含 2 张 DVD 的阵列。

a = []
a << DVD.new

会将 DVD 添加到阵列中。检查Ruby API 以获取数组函数的完整列表

顺便说一句,如果您想保留 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
于 2013-01-26T01:29:14.287 回答
8

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

于 2017-11-10T14:40:48.577 回答
6

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

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

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

    array << DVD.new << DVD.new
    

您可以随时将任何对象添加到数组中。

如果您希望访问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成为变量的值

您要做的是将变量的值传递给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's 标题,那么您可以这样做:

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
于 2013-01-26T11:21:02.983 回答