2013-12-03 3 views
0

У меня есть хеш меню, в котором мне нужно перебирать значения. Каждый товар имеет два размера: SML и LRG. Предположим, что это мой hash.Правильный способ работы с хешем в RUBY

fullMenu = [{:item => "pasta", :sml => 550, :lrg => 975}, 
      {:item => "chicken", :sml => 725, :lrg => 1150}, 
      {:item => "shrimp", :sml => 975, :lrg => 1350}] 

Теперь то, что я хотел бы сделать, это итерация по каждому item/size - price для построения меню.

fullMenu.each do |item, p_sml, p_lrg| 
    puts "#{item} Small: $#{p_sml} -or- Large: $#{p_lrg}" 
end 

Мой вывод:

{:item=>"pasta", :sml=>550, :lrg=>975} Small: $ -or- Large: $ 
{:item=>"chicken", :sml=>725, :lrg=>1150} Small: $ -or- Large: $ 
{:item=>"shrimp", :sml=>975, :lrg=>1350} Small: $ -or- Large: $ 

Не совсем то, что я хочу. Поскольку ничего не выводится. Наконец, я действительно хочу, чтобы мой puts был puts "#{item} Small: $#{"%.2f" % p_sml/100} -or- Large: $#{"%.2f" % p_lrg/100}" Чтобы правильно отобразить цену. Что мне здесь не хватает? И это называется многомерным hash или array?

ответ

2
fullMenu = [{:item => "pasta", :sml => 550, :lrg => 975}, 
      {:item => "chicken", :sml => 725, :lrg => 1150}, 
      {:item => "shrimp", :sml => 975, :lrg => 1350}] 

fullMenu.each { |h| 
    puts "%s Small: %.2f -or- Large: %.2f" % [h[:item], h[:sml]/100.0, h[:lrg]/100.0] 
} 

выход:

pasta Small: 5.50 -or- Large: 9.75 
chicken Small: 7.25 -or- Large: 11.50 
shrimp Small: 9.75 -or- Large: 13.50 
+0

Да! Спасибо. Именно то, что я хотел. – fyz

0

Вы можете запустить map на значении хэш:

2.0.0p247 :010 > fullMenu = [{:item => "pasta", :sml => 550, :lrg => 975}, 
2.0.0p247 :011 >     {:item => "chicken", :sml => 725, :lrg => 1150}, 
2.0.0p247 :012 >     {:item => "shrimp", :sml => 975, :lrg => 1350}] 
=> [{:item=>"pasta", :sml=>550, :lrg=>975}, {:item=>"chicken", :sml=>725, :lrg=>1150}, {:item=>"shrimp", :sml=>975, :lrg=>1350}] 
2.0.0p247 :013 > fullMenu.map(&:value) 
=> [{:item=>"pasta", :sml=>550, :lrg=>975}, {:item=>"chicken", :sml=>725, :lrg=>1150}, {:item=>"shrimp", :sml=>975, :lrg=>1350}] 

2.0.0p247 :014 > fullMenu.map(&:values) 
=> [["pasta", 550, 975], ["chicken", 725, 1150], ["shrimp", 975, 1350]] 

Затем, ваш код будет работать:

fullMenu.each do |item, p_sml, p_lrg| 
    puts "#{item} Small: $#{p_sml} -or- Large: $#{p_lrg}" 
end 

И это называется многомерным хэш или массив?

Это будет массив хешей. Если бы вы хотели, вы могли бы сделать массив массивов, но я думаю, что этот способ работает.

EDIT - Все это сказало, что лучший способ сделать это - это то, что имеет @falsetru.

+0

"Массив хешей." Благодаря CDub, это оптимальный способ использования массива/хэшей или вы бы предложили более эффективную настройку? – fyz

+0

Я бы полностью использовал ответ @ falsetru. :) – CDub

+0

Спасибо - я имел в виду, хотя вы думаете, что настройка моего массива/хэша, как я, была оптимальной? – fyz

Смежные вопросы