Так или иначе, вам нужна более мощная структура данных.
Ваш пост тяготеет к мысли, что weekly_sales
будет массивом, параллельным массиву books
. Недостаток этого подхода заключается в том, что вы должны поддерживать параллельность этих двух массивов самостоятельно.
Несколько лучшее решение - использовать название книги в качестве ключа к хэшу массивов, как предлагалось в нескольких ответах. Например: weekly_sales['Fahrenheit 451']
будет содержать массив данных о продажах для этой книги. Этот подход зависит от уникальности названий книг и имеет другие недостатки.
Более надежный подход, который вы могли бы рассмотреть, заключается в объединении информации о каждой книге в один пакет.
В самом простом конце спектра будет список хэшей. Каждая книга будет самостоятельной единицей по следующим направлениям:
books = [
{
'title' => 'Fahrenheit 451',
'sales' => [1,2,3],
},
{
'title' => 'Slaughterhouse-Five',
'sales' => [123,456],
},
]
puts books[1]['title']
На другом конце спектра будет создан надлежащий Book
класс.
И промежуточный подход заключается в использовании Struct
(или OpenStruct
), который занимает среднее место между хэшами и полномасштабными объектами. Например:
# Define the attributes that a Book will have.
Book = Struct.new(:title, :weekly_sales)
books = []
# Simulate some user input.
books_raw_input = "Fahrenheit 451,Slaughterhouse-Five\n"
sales_raw_input = ['1,2,3', '44,55,66,77']
books_raw_input.chomp.split(',').each do |t|
ws = sales_raw_input.shift.split(",")
# Create a new Book.
books.push Book.new(t, ws)
end
# Now each book is a handy bundle of information.
books.each do |b|
puts b.title
puts b.weekly_sales.join(', ')
end