2010-01-06 4 views
7

J'utilise le code suivant pour comparer les chaînes mais cela m'amène toujours au else. Pourquoi?Comment faire une comparaison de chaînes dans Ruby?

print("Enter your state abbreviation: ") 
state_abbreviation = gets 
if state_abbreviation.upcase == "NC" 
    puts("North Carolina") 
elsif state_abbreviation.upcase == "SC" 
    puts("Sourth Carolina") 
elsif state_abbreviation.upcase == "GA" 
    puts("Georgia") 
elsif state_abbreviation.upcase == "FL" 
    puts("Florida") 
elsif state_abbreviation.upcase == "AL" 
    puts("Alabama") 
else 
    puts("You have enter wrong abbreviation") 
end 

J'ai aussi essayé .eql?("string") mais j'obtenir le même résultat.

+1

Je ne sais vraiment pas Ruby très bien, mais pourquoi cette difficile et fragile si-si-si-else la structure? Utilisez une HashMap et, si vous ne récupérez rien, définissez le message d'erreur. Cela aiderait également le problème de nouvelle ligne tout le monde est sorti ci-dessous. – MikeHoss

+0

1. Je suis très nouveau à Ruby alors même ne sais pas si HashMP sortir là-bas? 2. Je n'aime pas cas-quand! – itsaboutcode

Répondre

27

La chaîne retournée par get aura un saut de ligne à la fin. Utilisez String#chomp pour l'enlever (c'est-à-dire state_abbreviation = gets.chomp). PS: Votre code aurait l'air beaucoup plus propre (à mon humble avis) si vous avez utilisé cas-quand au lieu de if-elsif-elsif.

+3

+1 pour la suggestion 'case'. 100% d'accord! –

+0

chomp chose m'avait rendu fou .... merci pour la réponse .. Vous êtes le vrai MVP. –

5

Avant le grand bloc, disent:

state_abbreviation.chomp! 

Comme alternative à une excellente suggestion sepp2k d'utiliser case, pensez à faire un hachage avec les abréviations d'état que les clés.

0

gets Retourne ce que vous avez tapé avec une nouvelle ligne. Essayez state_abbreviation = gets.chomp

0

Vous utilisez obtient, et probablement votre shell/entrée ajoute une nouvelle ligne caractère (\ n) à la fin de la chaîne, et peut-être que vous pouvez utiliser la déclaration de cas:

exemple:

print("Enter your state abbreviation: ") 
state_abbreviation = gets.strip 

case state_abbreviation 
    when "NC" then puts("North Carolina") 
    when "SC" then puts("South Carolina") 
    # ... 
    else puts("You have enter wrong abbreviation") 
end 
15

Je n'ai pas assez de points pour commenter, mais je pense que l'idée de Chris Jester-Young est vraiment sympa.

statehash = { "RI" => "Rhode Island", "NC" => "North Carolina" } 

print "Enter your state abbreviation: " 
state_abbreviation = gets.chomp.upcase 

puts statehash[state_abbreviation] 

ce code est beaucoup plus concis et clair qu'un tas de elsif et plus court qu'un boîtier. Il permet également un hachage d'objets d'état, où la clé est l'abréviation et la valeur est l'objet.

+0

Merci pour le vote de confiance! Très appréciée. –

+0

J'utiliserais un tableau, avec un 'in_array? (State)' ou quelque chose du genre. A moins que hash ait sa propre syntaxe comme ça. – Garrett

+0

statehash [state_abbreviation] renvoie une valeur, donc dans mon exemple, RI ou NC fonctionnent, sinon nil est renvoyé. Les hash ont-ils .has_key ?, .has_value? mais je ne vois pas le besoin de l'utiliser ici. – Beanish

0

Alors que nous sommes hors sujet et commentant l'approche par rapport au problème, consultez cette distribution. Il tire dans toutes les abréviations d'état d'un site Web. Je suis un fan de ceci parce qu'il obtient entièrement les mappings de votre code (bien que ce pourrait être une bonne idée de sauver le site, juste au cas où). Vous pouvez ensuite mettre cela avec un cache pour éviter de toucher la base de données.

http://railscasts.com/episodes/179-seed-data

http://railscasts.com/episodes/115-caching-in-rails-2-1

+0

Ce n'est pas une bonne idée de construire une dépendance sur un autre site à moins que vous ne le possédiez.Votre code peut se casser si le site tombe en panne, ou aller à un crawl si le leur est lent. En outre, si votre code est beaucoup frappé, il va beaucoup frapper leur site, ce qui peut leur coûter de l'argent, sans qu'ils en bénéficient. C'est similaire au deep-linking, ce qui est un bon moyen d'ajouter l'adresse IP de votre site à leur fichier .htaccess, ce qui vous empêche d'y accéder. Si les données sont uniques à ce site, prenez des dispositions pour les droits d'utilisation, car ils pourraient être protégés par des droits d'auteur. Si ce n'est pas le cas, créez votre propre référentiel local où vous contrôlez sa disponibilité. –