2010-01-06 11 views
7

Estoy usando el siguiente código para comparar cadenas pero siempre me lleva al else. ¿Por qué?¿Cómo hago la comparación de cadenas en 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 

también he intentado .eql?("string") pero me da el mismo resultado.

+1

Realmente no sé rubí muy bien, pero ¿por qué tener esta difícil y frágil si-si-si-else estructura? Use un HashMap y, si no obtiene nada, configure el mensaje de error. Esto también ayudaría al nuevo problema al que todos salieron a continuación. – MikeHoss

+0

1. Soy muy nuevo en ruby, ¿por qué no sé si HashMP saldrá de allí? 2. No me gusta el caso, ¿cuándo? – itsaboutcode

Respuesta

27

La cadena devuelta por gets tendrá un salto de línea al final. Use String#chomp para eliminarlo (es decir, state_abbreviation = gets.chomp).

PD: Su código se vería mucho más limpio (en mi humilde opinión) si usó case-when en lugar de if-elsif-elsif.

+3

+1 para la sugerencia 'case '. ¡100% de acuerdo! –

+0

chomp thing me había vuelto loco .... gracias por la respuesta ... Eres el verdadero MVP. –

5

Antes del gran bloque, dicen:

state_abbreviation.chomp! 

Como alternativa a la de sepp2k excelente sugerencia de utilizar case, considere hacer un hash con las abreviaturas de los estados como llaves.

0

gets devuelve lo que ha escrito con una nueva línea. Trate state_abbreviation = gets.chomp

0

Está utilizando obtiene, y probablemente su cáscara/de entrada es la adición de un carácter de nueva línea (\ n) al final de la cadena, y tal vez es posible que desee utilizar la declaración de caso:

ejemplo:

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

No tengo suficientes puntos para comentar, pero creo que la idea de hachís de Chris Jester-Young es muy buena.

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

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

puts statehash[state_abbreviation] 

este código es mucho más conciso y claro que un montón de elsif y más corto que un caso. También permite un hash de objetos de estado, donde la clave es la abreviatura y el valor es el objeto.

+0

¡Gracias por el voto de confianza! Muy apreciado. –

+0

De hecho, usaría una matriz, con un 'in_array? (State)' o algo por el estilo. A menos que el hash tenga su propia sintaxis. – Garrett

+0

statehash [state_abbreviation] o bien devuelve un valor para que en mi ejemplo funcione RI o NC, sino se devuelve nil. ¿Hashes tiene .has_key ?, .has_value? pero no veo la necesidad de usar eso aquí. – Beanish

0

Mientras estamos fuera del tema y comentando el enfoque frente al problema, echa un vistazo a este elenco de rieles. Él atrae todas las abreviaturas estatales de un sitio web. Soy un fanático de esto porque obtiene las asignaciones de tu código por completo (aunque podría ser una buena idea guardar el sitio, por las dudas). Podrías poner eso junto con un caché para evitar golpear el DB.

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

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

+0

No es una buena idea crear una dependencia en otro sitio a menos que sea el propietario.Su código se puede romper si el sitio se cae o si se ralentiza. Además, si su código es golpeado mucho, llegará a su sitio mucho, lo que potencialmente les costará dinero, sin que se beneficien. Es similar a la creación de enlaces profundos, que es una buena forma de agregar la IP de su sitio a su archivo .htaccess y denegarle el acceso. Si los datos son exclusivos de ese sitio, organice los derechos de uso ya que podrían estar protegidos por derechos de autor. Si no tiene derechos de autor, construya su propio repositorio local donde controle su disponibilidad. –

Cuestiones relacionadas