Je demande à un utilisateur la clé currentline
et la valeur currentstation
afin de la comparer à un hachage et d'afficher la ligne à parcourir.
mtahash = { n: ["timesq", "34thn", "28thn", "23rdn", "Union_Square", "8th"], l: ["8th", "6th", "Union_Square", "3rd", "1st"], s: ["Grand Central", "33rds", "28th", "23rds", "Union Square", "Astor Place"] } puts "Please enter your current station" current_station = gets.chomp puts "Please enter your current line" current_line = gets.chomp mtahash.each do |key, value| if key == current_line && value == current_station puts "got it" else puts "fish" end end
3 Réponses :
Une valeur
dans cette itération est un tableau. Vous devriez vérifier s'il inclut le nom de la station, pas s'il lui est égal. Transformez également la clé en chaîne avec key.to_s
(c'est un symbole maintenant):
mtahash.each do |key, value| if key.to_s == current_line && value.include?(current_station) puts "got it" else puts "fish" end end
corrigé la faute de frappe.
Cela va s'exécuter une fois pour chaque clé dans mtahash
. Par exemple, current_line = 'n', current_station = '8th' => a obtenu \ n fish \ n fish
. Est-ce la fonctionnalité prévue?
@Tom est aussi proche que possible de la solution originale.
@mrzasa était juste curieux de savoir ce que Fahz dirait qu'il recherchait. Rien contre ta réponse.
pour l'instant, oui, c'est la seule chose à exécuter @Tom
each
va itérer pour chaque valeur de clé (même si une correspondance est trouvée) mais detect
s'arrêtera une fois qu'il aura trouvé une correspondance.
Je pense que les clés pour le hachage est unique donc detect
est mieux que d'utiliser each
> mtahash = {:n=>["timesq", "34thn", "28thn", "23rdn", "Union_Square", "8th"], :l=>["8th", "6th", "Union_Square", "3rd", "1st"], :s=>["Grand Central", "33rds", "28th", "23rds", "Union Square", "Astor Place"]} > current_line, current_station = 'l', '3rd' => ["l", "3rd"] > mtahash.detect { |k, v| k.to_s == current_line && v.include?(current_station) } ? 'got it' : 'fish' => "got it" > current_line, current_station = 'l', '43rd' => ["l", "43rd"] > mtahash.detect { |k, v| k.to_s == current_line && v.include?(current_station) } ? 'got it' : 'fish' => "fish"
Réduisez les itérations.
mtahash.detect { |k, v| k.to_s == current_line && v.include?(current_station) } ? 'got it' : 'fish'
Cette ligne de code est compréhensible mais ne fonctionne toujours pas. La sortie est toujours poisson 3 fois quelle que soit l'entrée
@fahz c'est impossible ce que vous avez dit, vérifiez le journal mis à jour dans ma réponse
cela ne fonctionne pas à coup sûr à ma fin .. ne donne aucune sortie sauf pour fish: ((((((((
@fahz parce que vous n'avez pas fourni ce que votre hachage a! par exemple. n
et 23rdn
Qu'est-ce que cela veut dire? Le hachage est déjà défini en haut. J'essaie également le code sans entrée de l'utilisateur. Je suis juste en train de le coder en dur, mais cela ne fonctionne toujours pas - qu'est-ce que je fais de mal?
@fahz, vous devez publier votre current_line
, current_station
ici
continuons cette discussion dans le chat .
Je suggère de convertir en_sym
( String # to_sym ) l'entrée utilisateur pour current_line, puisque les clés de hachage sont des symboles.
Ensuite, vérifiez si le hachage a cette clé ( Hash # has_key ).
Enfin, accédez au hachage par et vérifiez si le tableau inclut ( Array # include ) la station_actuelle
, car les valeurs du hachage sont des tableaux.
Ceci n'est qu'un extrait de code à titre d'exemple.
current_station = "timesq" # gets.chomp current_line = "n".to_sym # gets.chomp.to_sym <--- note .to_sym if mtahash.has_key? current_line if mtahash[current_line].include? current_station then puts "got it" else puts "fish" end else puts "no line" end
c'est une chaîne et devrait être n'importe quelle valeur du hachage
Je suis très nouveau dans l'apprentissage du codage et du rubis pour être précis - c'est tellement à apprendre mais j'apprends et j'y arriverai éventuellement. :)