Здесь много чего не так, но ничего нельзя исправить:
- Хранение всех экземпляров в переменной класса немного странно.Создание экземпляров и отслеживание их вызывающим будет более распространенным и менее запутанным.
- Ваш
while count <= ...
цикл не завершается с end
. - Ваше условие цикла выглядит неправильно,
name_url_price[0]
является первым элементом name_url_price
, поэтому name_url_price[0].length
, вероятно, всегда будет три.Если name_url_price
больше похоже на [ [names], [urls], [prices] ]
, то условие правильное, но это странный и запутанный способ хранения ваших данных. while
циклы для итерации очень редки в Ruby, вы обычно используетеname_url_place.each do ... end
или что-то из Enumerable
. - Индексирование вашего массива возможно обратное, вы хотите сказать
name_url_price[count][0]
, name_url_price[count][1]
, ... Но смотрите (3) , еслиЯ неправильно понимаю, как структурированы ваши данные. - Ваш
@@all << self
просто добавляет один и тот же объект (self
) к @@all
снова и снова.@@all
будет заканчиваться множеством ссылок на один и тот же объект, и атрибуты этого объекта будут соответствовать последней итерации цикла while
. - Метод
initialize
предназначен для инициализации одного экземпляра, имеющего егосоздать кучу экземпляров очень странно и запутанно.
Было бы более распространенным и понятным для вашего класса выглядеть так:
class Catalog::Supplies
attr_accessor :name, :price, :url
def initialize(name, url, price)
self.name = name
self.url = url
self.price = price
end
end
А потом ваш name_url_price
массив будет выглядеть примерно так:
name_url_price = [
[ 'name1', 'url1', 1 ],
[ 'name2', 'url2', 2 ],
[ 'name3', 'url3', 3 ],
[ 'name4', 'url4', 4 ]
]
и для получения расходных материалов в качестве объектов, что бы ни требовалось в списке:
supplies = name_url_price.map { |a| Catalog::Supplies.new(*a) }
Вы также можете использовать хэши в name_url_price
:
name_url_price = [
{ name: 'name1', url: 'url1', price: 1 },
{ name: 'name2', url: 'url2', price: 2 },
{ name: 'name3', url: 'url3', price: 3 },
{ name: 'name4', url: 'url4', price: 4 }
]
, а затем создайте свои экземпляры следующим образом:
supplies = name_url_price.map do |h|
Catalog::Supplies.new(
h[:name],
h[:url],
h[:price]
)
end
или вот так:
supplies = name_url_price.map { |h| Catalog::Supplies.new(*h.values_at(:name, :url, :price)) }