Ruby: массив объектов/классов

Я не эксперт по рубину, и это вызывает у меня проблемы. Но как бы я начал создавать массив объектов/классов в рубине? Как инициализировать его/объявить? Заранее спасибо за помощь.

Это мой класс, и я хочу создать его массив:

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

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

Ответ 1

Ruby - это утка (динамическая типизация) И почти все - объект, поэтому вы можете просто добавить любой объект в массив. Например:

[DVD.new, DVD.new]

создаст массив с двумя DVD-дисками.

a = []
a << DVD.new

добавит DVD в массив. Посмотрите Ruby API для полного списка функций массива.

Btw, если вы хотите сохранить список всех экземпляров 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

Ответ 2

Чтобы создать массив объектов в Ruby:

  • Создайте массив и привяжите его к имени:

    array = []
    
  • Добавьте к нему свои объекты:

    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

Устанавливает переменные экземпляра, несмотря на отсутствие аргументов. Что действительно происходит:

  • Метод чтения attribute называется
  • Он читает переменную unset
  • Он возвращает nil
  • 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, вы можете сделать это следующим образом:

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

Ответ 3

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