2016-08-09 3 views
1

Буду признателен, если кто-то поможет мне понять, почему мой код не проходит. Здесь я приводил аргументы.Вложенные манипуляции с хешем

корзину товар:

{ 
    "AVOCADO" => {:price => 3.0, :clearance => true, :count => 3}, 
    "KALE" => {:price => 3.0, :clearance => false, :count => 1} 
} 

купоны:

{:item => "AVOCADO", :num => 2, :cost => 5.0} 

Это требует от меня, чтобы вернуть это:

{ 
    "AVOCADO" => {:price => 3.0, :clearance => true, :count => 1}, 
    "KALE" => {:price => 3.0, :clearance => false, :count => 1}, 
    "AVOCADO W/COUPON" => {:price => 5.0, :clearance => true, :count => 1}, 
    } 

Вот мой код:

def apply_coupons(cart:[], coupons:[]) 

    app_coupon = {} 
    cart.each do |items| 
    items.each do |item_name, value| 
     app_coupon[item_name] = value 
     coupons.each do |coupon| 
     if coupon[:item] == item_name 
      app_coupon["#{coupon[:item]} W/COUPON"] = {:price => coupon[:cost], :clearance => value[:clearance], :count => value[:count]/coupon[:num] } 
      app_coupon[item_name][:count] -= coupon[:num] 
     end 
     end 
    end 
    end 
    app_coupon 
end 
+0

Непонятно, почему у вашего купона есть 'num: 2', но вы только скидываете один с купоном. Вы также объявляете аргументы ключевого слова с параметрами по умолчанию, когда вы действительно ожидаете хэш. – tadman

+0

да, мои аргументы - хеши внутри массива cart & coupons. –

+0

Возможно, вы захотите объявить метод как 'cart: {}, coupons: {}', если это так. Странно, что вы используете Ruby 2.3 ключевое слово-редуцирование, но обозначение хеша Ruby 1.8. Для согласованности: 'цена: 3.0, оформление: истинно, ...' – tadman

ответ

0

Одна из возможных проблем ..

купоны:

{:item => "AVOCADO", :num => 2, :cost => 5.0} 

... это только один хэш, но в вашем коде, вы делаете ...

coupons.each do |coupon| 

.. поэтому вы ожидаете массив. Вы должны сделать купоны:

[{:item => "AVOCADO", :num => 2, :cost => 5.0}] 
+0

На самом деле это выглядит так, когда я пытаюсь в irb. 'apply_coupons (cart: [{ " AVOCADO "=> {: price => 3.0,: clear => true,: count => 3}, " KALE "=> {: price => 3.0,: gap = > false,: count => 1} }], купоны: [{: item => "AVOCADO",: num => 2,: cost => 5.0}]) ' –

+0

Так что я попробовал, он отлично работает! Я получил результат ... '{" AVOCADO "=> {: price => 3.0,: clear => true,: count => 1}," AVOCADO W/COUPON "=> {: price => 5.0,: clear => true,: count => 1}, "KALE" => {: price => 3.0,: clear => false,: count => 1}} ' – SteveTurczyn

+0

Итак, проблема заключается в вашем тесте (rspec). Можете ли вы опубликовать свой код rspec и объяснить, какую ошибку вы видите в своих тестах? – SteveTurczyn

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