L'écriture d'un « Supprimer produit nommé de hachage » méthode
Il existe des moyens plus courtes de le faire, mais le tir de clarté je suis venu avec ceci:
products = {124 => ['shoes', 59.99], 352 => ['shirt', 19.99], 777 => ['pants', 19.87],
667 => ['jacket', 39.99], 898 => ['shoulder_holster', 22.78]}
def wipeProduct(hash, nameToDelete)
hash.each do |i|
key = i[0]
productName = i[1].first
hash.delete(key) if productName==nameToDelete
end
end
puts products.inspect
wipeProduct(products,'pants')
puts products.inspect
wipeProduct(products,'shoulder_holster')
puts products.inspect
bash-3.2$ ruby prod.rb
{352=>["shirt", 19.99], 898=>["shoulder_holster", 22.78], 667=>["jacket", 39.99], 777=>["pants", 19.87], 124=>["shoes", 59.99]}
{352=>["shirt", 19.99], 898=>["shoulder_holster", 22.78], 667=>["jacket", 39.99], 124=>["shoes", 59.99]}
{352=>["shirt", 19.99], 667=>["jacket", 39.99], 124=>["shoes", 59.99]}
Je ne sais pas s'il est possible de « pantalon » pour se produire dans le hachage en plusieurs endroits, mais depuis que je « hash.each (...) », la méthode wipeProduct (hachage , nameToDelete) va tester y entrée de hachage.
Le type d'entrée bug et comment corriger
Lorsque vous prenez l'entrée, vous affectez la chaîne capturée à d. Voici la preuve:
irb(main):010:0> d = gets.to_s
12
=> "12\n"
irb(main):011:0> d.class
=> String
Vous pouvez convertir cette chaîne à un Fixnum comme ceci:
irb(main):012:0> d.to_i
=> 12
irb(main):013:0> d.to_i.class
=> Fixnum
Toutes les clés du hachage produits sont Fixnum. Voici la preuve:
irb(main):014:0> products.keys.each {|i| puts i.class}
Fixnum
Fixnum
Fixnum
Fixnum
Fixnum
=> [352, 898, 667, 777, 124]
Vous avez donc besoin de saisir la valeur de l'argument avec cette ligne:
d = gets.to_i # Get value for argument
La partie de la suppression de la réponse:
Des produits, vous pouvez supprimer l'entrée de pantalons par programme avec ceci:
products.delete (777)
Son exécution vous obtient ceci:
irb(main):003:0> products.delete(777)
=> ["pants", 19.87]
Notez que vous fournissez la valeur de clé (dans ce cas 777) à .delete() et qu'il retourne un tableau composé de la clé et de la valeur dans cet ordre, respectivement .
Une implémentation alternative
Je ne sais pas s'il est sûr de modifier un hachage dans un bloc qui est itérer sur les paires clé-valeur dans le hachage. Dans le cas contraire, il vous suffit d'enregistrer toutes les clés à supprimer et de les supprimer après itérer la table de hachage:
def wipeProduct(hash, nameToDelete)
keysToDelete = []
hash.each do |i|
key = i[0]
productName = i[1].first
keysToDelete << key if productName==nameToDelete
end
keysToDelete.each {|key| hash.delete(key) }
end
btw merci pour toutes les informations que les gars aident à retirer les cheveux – Matt