2016-06-04 3 views
0

J'ai créé une classe appelée Dish, où j'ai ensuite créé un certain nombre d'objets de menu, des éléments pour un menu contenant le nom et le prix, les informations qui ont été obtenues grâce à la méthode initialisée. lorsque vous appelezComment itérer sur un tableau de hachages contenant des informations sur les objets instanciés dans Ruby?

chickenstew = Dish.new("Chicken Stew", 4.50) 

J'ai ensuite ajouté un certain nombre de ces objets à un tableau contenu dans une variable d'instance @menu = [] d'une nouvelle classe, appelée Menu, en utilisant la méthode def add_to_menu et @menu << args. Lorsque je visualise le nouveau tableau de menu contenant les objets individuels, vous obtenez évidemment les informations d'objet, en plus de l'information de nom et le prix comme suit:

[[#<Dish:0x007f9662134818 @dish={:name=>"Chicken Stew", :price=>4.5}>, 
    #<Dish:0x007f966206ec30 @dish={:name=>"Beef & Ale Pie", :price=>5.0}>, 
    #<Dish:0x007f966101a7a8 @dish={:name=>"Chicken & Leek Pie", :price=>4.0}>, 
    #<Dish:0x007f9662365420 @dish={:name=>"Vegetable Pie", :price=>3.5}>, 
    #<Dish:0x007f96622de038 @dish={:name=>"Fish Pie", :price=>5.5}>, 
    #<Dish:0x007f966224f068 @dish={:name=>"Chips", :price=>2.0}>, 
    #<Dish:0x007f966222c1d0 @dish={:name=>"Mushy Peas", :price=>1.5}>]] 

Ma question est, comment diable voulez-vous itérer cette tableau de hachages, afin d'extraire juste le nom et les détails du prix, afin de puts cela à l'écran? J'ai essayé @menu.each { |hash| puts "Item: #{hash[:name]. Price: £#{hash[:price]}" } mais cela ne fonctionne pas évidemment et je reçois pas de fin d'erreurs telles que « TypeError: pas de conversion implicite de symbole en entier »

Toute aide serait appréciée.

+0

Vous avez '[[..]]', donc '@menu [0] .each {..' fonctionnera. Ce que vous pensez être 'Hash', ils sont en fait un objet' Dish', qui est un objet 'AR'. –

+0

Bravo pour cette aide, ce n'est malheureusement pas le cas, mais c'est peut-être parce que j'avais besoin d'appeler dish.name et dish.price plutôt que d'essayer le code comme c'était le cas, mais en ajoutant le [0]. Salut! – sdawes

+0

L'erreur venait de '@menu.each {| hash | ', ce que vous pensez ici un' hash' est le 'Array' interne. Et sur ce que vous avez appelé '[: nom]' et qui jette l'erreur. Donc '@menu [0] .each {| hash | met "Item: # {hash [: name]. Prix: £ # {hash [: price]}"} 'fonctionnera aussi. –

Répondre

3

Ce n'est pas un hachage à l'intérieur de votre tableau. C'est l'objet de la classe Dish, donc:

@menu.first.each { |dish| puts "Item: #{dish.name}. Price: £#{dish.price}" } 
+0

Incroyable, cela a fonctionné parfaitement, merci pour la réponse très rapide, vous venez de me sauver des heures de plus d'essais et d'erreurs. – sdawes