2016-11-02 1 views
0

Ich bin neu bei Ruby und habe Schwierigkeiten bei der Fertigstellung dieses Warenkorbprogramms. Ich bin mir nicht sicher, was ich falsch mache. Kann jemand mir sagen, wie man die letzten zwei Zeilen erhält, um den Code auszugeben, den ich in den Anmerkungen neben ihnen habe? Jede Hilfe wäre willkommen. Vielen Dank.Ruby Einkaufswagen

class Store 

    def initialize 
     @products = {"eggs" => 1.5, "bread" => 3.00, "granola cereal" => 3.4, "coffee" => 2.3, "pie" => 4.7} 
     @cart = [] 
    end 

    def add_to_cart(item) 
     @cart << item 
    end 

    def add_product(item, price) 
     @products[item] = price 
    end 

    def cart_total 
     @cart.inject(0){|sum, item| sum + @products[item]} 
    end 

    def items 
     @products.join(', ') 
    end 
end 


store = Store.new     
store.add_to_cart "eggs" 
store.add_to_cart "Pie" 
store.add_to_cart "bread" 
puts store.cart      # output: eggs, pie, bread 
printf "$%6.2f", store.cart_total # output: $ 9.20 

Wenn ich versuche, dies zu laufen, bekomme ich diesen Fehler:

nil can't be coerced into Float 
(repl):17:in `+' 
(repl):17:in `block in total' 
(repl):17:in `each' 
(repl):17:in `inject' 
(repl):17:in `total' 
(repl):28:in `<main>main>' 
+0

Überprüfen Sie die Groß-/Kleinschreibung von 'pie' ;-) – Carpetsmoker

+0

Denken Sie daran, dass Fließkommawerte immer Näherungen sind, daher ist es problematisch, sie für monetäre Berechnungen zu verwenden. – tadman

Antwort

0

Das Problem ist ein Großbuchstabe in store.add_to_cart "Pie". Dies fügt die Zeichenfolge "Pie" zu Ihrem Array @cart hinzu. Wenn Sie iterieren über @cart mit #inject, @products["Pie"] gibt nil zurück, da es in Ihrem Hash keinen Schlüssel für "Pie" gibt (die Schlüssel beachten Groß-und Kleinschreibung). Sie können nil nicht zu sum hinzufügen, was ein Float ist.

Versuchen Sie es erneut mit einem Kleinbuchstaben "Kuchen" und es sollte gut funktionieren. Oder, um Großschreibungsprobleme in Zukunft zu vermeiden, ändern Sie Ihre cart_total Methode zu @cart.inject(0){ |sum, item| sum + @products[item.downcase] }.