2010-01-06 6 views
7

Ich verwende den folgenden Code, um Strings zu vergleichen, aber es bringt mich immer zum else. Warum?Wie mache ich String-Vergleich in 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 

Ich habe auch .eql?("string") versucht, aber ich habe das gleiche Ergebnis.

+1

ich sehr gut weiß nicht, Rubin wirklich, aber warum haben diese schwer und zerbrechlich if-if-if-else-Struktur? Verwenden Sie eine HashMap und, wenn Sie nichts zurückbekommen, stellen Sie die Fehlermeldung ein. Dies würde auch das Newline-Problem helfen, jeder trat unten heraus. – MikeHoss

+0

1. Ich bin sehr neu in Ruby, also nicht wissen, ob HashMP dort verlassen? 2. Ich mag Fall-wenn nicht! – itsaboutcode

Antwort

27

Die von gets zurückgegebene Zeichenfolge hat am Ende einen Zeilenumbruch. Verwenden Sie String#chomp, um es zu entfernen (d. H. state_abbreviation = gets.chomp).

PS: Ihr Code würde viel sauberer aussehen (IMHO), wenn Sie case-wenn statt if-elsif-elsif.

+3

+1 für den 'Fall'-Vorschlag. 100% stimmen zu! –

+0

chomp ding hatte mich verrückt gemacht .... danke für die Antwort ... Du bist der echte MVP. –

5

Vor dem großen Block, sagen:

state_abbreviation.chomp! 

Als Alternative ausgezeichneten Vorschlag ist zu sepp2k case zu verwenden, sollten Sie einen Hash mit den staatlichen Abkürzungen als Schlüssel.

0

gets gibt zurück, was Sie mit einem Zeilenumbruch eingegeben haben. Versuchen state_abbreviation = gets.chomp

0

Sie verwenden wird, und wahrscheinlich der Shell/Eingabe fügt eine neue Zeile (\ n) Zeichen am Ende der Zeichenfolge, und vielleicht können Sie die Case-Anweisung verwenden:

Beispiel:

15

Ich habe nicht genug Punkte zu kommentieren, aber ich denke, die Hash-Idee von Chris Jester-Young ist wirklich ordentlich.

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

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

puts statehash[state_abbreviation] 

Dieser Code ist deutlich prägnanter und klarer als ein Bündel von elsif und kürzer als ein Fall. Es ermöglicht auch einen Hash von Zustandsobjekten, wobei der Schlüssel die Abkürzung und der Wert das Objekt ist.

+0

Danke für das Vertrauensvotum! Sehr geschätzt. –

+0

Ich würde tatsächlich ein Array verwenden, mit einem 'in_array? (Zustand)' oder etwas in der Art. Es sei denn, Hash hat eine eigene Syntax wie diese. – Garrett

+0

Statehash [state_abbreviation] gibt entweder einen Wert zurück, so dass in meinem Beispiel RI oder NC funktionieren, sonst wird nil zurückgegeben. Hashes haben .has_key ?, .has_value? aber ich sehe nicht die Notwendigkeit, das hier zu verwenden. – Beanish

0

Während wir nicht am Thema sind und den Ansatz gegen das Problem kommentieren, sehen Sie sich diese Schiene an. Er zieht alle staatlichen Abkürzungen von einer Website ein. Ich bin ein Fan davon, weil es die Mappings vollständig aus Ihrem Code herausholt (obwohl es eine gute Idee wäre, die Site zu speichern, nur für den Fall). Sie könnten das dann mit einem Cache zusammensetzen, um zu verhindern, dass Sie tatsächlich auf die DB treffen.

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

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

+0

Es ist keine gute Idee, eine Abhängigkeit von einer anderen Site aufzubauen, es sei denn, Sie besitzen sie.Ihr Code kann brechen, wenn die Site ausfällt, oder zu einem Crawl wechseln, wenn der Code langsam ist. Auch wenn Ihr Code viel getroffen wird, wird er viel auf seiner Seite erscheinen und möglicherweise Geld kosten, ohne dass er davon profitiert. Es ähnelt dem Deep-Linking, was eine gute Möglichkeit ist, die IP Ihrer Site in ihre .htaccess-Datei zu integrieren, die Ihnen den Zugriff verweigert. Wenn die Daten für diese Site eindeutig sind, dann arrangieren Sie Nutzungsrechte, da diese möglicherweise urheberrechtlich geschützt sind. Wenn es nicht urheberrechtlich geschützt ist, erstellen Sie ein eigenes lokales Repository, in dem Sie die Verfügbarkeit steuern. –