2009-11-05 3 views
0

Vous essayez de comprendre la syntaxe pour appeler différentes valeurs d'un hachage. Par exemple permet de dire que je suis en train de supprimer « pantalon » Comment ne vont sur la définition de l'argument pour quelque chose comme ceci:valeurs de l'argument des méthodes de hachage

products = {124 => ['shoes', 59.99], 352 => ['shirt', 19.99], 777 => ['pants', 19.87], 
667 => ['jacket', 39.99], 898 => ['shoulder_holster', 22.78]} 

Lors de l'écriture d'un programme axé sur le menu pour ce hachage Je y compris la vérification des erreurs avant deleteing ou l'ajout d'une clé c'est ce que j'ai jusqu'à présent:

if a == 3     # Loop delete a Product 
puts "Delete a Product" 
d = gets.to_s # Get value for argument 

    while products.has_value?( d + syntax for right here???? )!= true do 
    puts "This turned out false because product does not exsist!" 
    d = gets.to_s 
    end 

puts "Congrats your out of the loop" 
products.delete(d + again syntax problems ????) 
puts products 

fin

Comment puis-je entrer dans la syntaxe de l'argument si je où supprimer des pantalons. Serait-ce ([d,: nombre]) Je n'ai pas de chance avec des ressources en ligne avec la façon de supprimer ou d'ajouter dans ce scénario. Toute aide ou un exemple de code serait apprécié,

Matt

Répondre

1

Cela dépend si l'utilisateur saisit le numéro d'identification ou le nom "pantalon". Si l'ancien:

if a == 3     # Loop delete a Product 
    puts "Delete a Product" 
    d = gets # Get value for argument 

    until products.has_key?(d.to_i) 
    puts "This turned out false because product does not exsist!" 
    d = gets 
    end 

    puts "Congrats your out of the loop" 
    products.delete(d.to_i) 
    puts products 
end 

Si c'est « pantalon », alors c'est la façon dont vous voulez faire:

if a == 3     # Loop delete a Product 
    puts "Delete a Product" 
    d = gets.strip # Need to strip because otherwise the newline will wreck it 

    until products.find {|key, val| val.first == d} 
    puts "This turned out false because product does not exsist!" 
    d = gets.strip 
    end 

    puts "Congrats your out of the loop" 
    products.delete_if {|key, val| val.first == d} 
    puts products 
end 
1

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 
2
products.to_a.select {|a| a.last.first == 'pants' } 

que vous obtiendrez le dossier qui correspond à « pantalon ».

[[777, ["pants", 19.87]]] 

Je pense donc que vous voulez

while !products.to_a.select {|a| a.last.first == d }.empty? 

sur votre boucle puis utilisez la ligne de Dafydd pour supprimer l'enregistrement.

1

est ici la plus sommaire de supprimer le "pantalon" entrée:

def wipeProduct(hash, nameToDelete) 
    hash.reject!{|key,value| nameToDelete==value.first} 
end 

Rejeter! block voit chaque paire clé-valeur, et quand elle renvoie true, la valeur-clé fournie sera supprimée du hachage.

0
if a == 3     # Loop delete a Product 
puts "Delete a Product by its key number" 
d = gets 
while products.has_key?(d)!= false do 
    puts "You have selected a key that is not currently in use" 
    d = gets 
end 
puts "You have deleted" 
products.delete(d) 
puts products 
end 

C'est ce que je fini par faire eu quelques problèmes avec l'avant boucle donc permuté pendant une boucle while car il n'accepterait pas les touches nouvellement saisies pour une raison quelconque

+0

btw merci pour toutes les informations que les gars aident à retirer les cheveux – Matt

Questions connexes