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}