Я вижу два начальных подхода, а именно: определить класс для представления вашего ключа, пары значений или просто использовать хеш для представления каждого элемента данных.Преимущество отдельного класса заключается в том, что вы можете расширить его в будущем, если, например, вы хотите указать точное значение в диаграмме, на которой вы округлялись до ближайших 100 тыс.
1002 * В следующем коде показаны три классакоторый вместе будет делать то, что вы хотите
class Chart
attr_accessor :title, :series
def initialize(title = nil, series = [])
@title, @series = title, series
end
def show
puts title
@series.each do |ser|
puts "\t#{ser.legend} (#{ser.units})"
ser.data.each do |item|
puts "\t\t#{item}"
end
end
end
end
class Series
attr_accessor :legend, :units, :data
def initialize(legend = nil, units = nil, data = [])
@legend, @units, @data = legend, units, data
end
end
class DataItem
attr_accessor :key, :value
def initialize(key, value)
@key, @value = key, value
end
def to_s
"#{key}, #{value}"
end
end
Выполнение этого следующим образом: -
c = Chart.new("Sweet sales by Quarter")
c.series << Series.new("Bon-Bons", "£000",
[ DataItem.new("Q1", 220),
DataItem.new("Q2", 280),
DataItem.new("Q3", 123),
DataItem.new("Q4", 200)]
)
c.series << Series.new("Humbugs", "£000",
[ DataItem.new("Q1", 213),
DataItem.new("Q2", 254),
DataItem.new("Q3", 189),
DataItem.new("Q4", 221)]
)
c.show
Создает следующий вывод
Sweet sales by Quarter
Bon-Bons (£000)
Q1, 220
Q2, 280
Q3, 123
Q4, 200
Humbugs (£000)
Q1, 213
Q2, 254
Q3, 189
Q4, 221
Если вы хотите взятьВ этом случае вам больше не понадобится класс DataItem, и вы можете создать новую серию с кодом, подобным этому
c = Chart.new("Sweet sales by Quarter")
c.series << Series.new("Bon-Bons", "£000",
[ { "Q1" => 220}, {"Q2" => 280}, {"Q3" => 123}, {"Q4" => 200}]
)
Метод show Chart будет выглядеть следующим образом
def show
puts title
@series.each do |ser|
puts "\t#{ser.legend} (#{ser.units})"
ser.data.each do |item|
item.each_pair {|key, value| puts "\t\t#{key}, #{value}" }
end
end
end