Как мне сделать сравнение строк в Ruby? - PullRequest
7 голосов
/ 06 января 2010

Я использую следующий код для сравнения строк, но он всегда приводит меня к else. Зачем?

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

Я также пробовал .eql?("string"), но получаю тот же результат.

Ответы [ 6 ]

28 голосов
/ 07 января 2010

Строка, возвращаемая get, будет иметь разрыв строки в конце. Используйте String#chomp, чтобы удалить его (т.е. state_abbreviation = gets.chomp).

PS: Ваш код выглядел бы намного чище (ИМХО), если бы вы использовали case-when вместо if-elsif-elsif.

15 голосов
/ 07 января 2010

У меня недостаточно очков, чтобы комментировать, но я думаю, что идея хэша Криса Джестера-Янга действительно хороша.

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

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

puts statehash[state_abbreviation]

этот код намного более лаконичен и понятен, чем связка elsif, и короче кейса. Он также допускает хеш объектов состояния, где ключом является аббревиатура, а значением является объект.

5 голосов
/ 07 января 2010

Перед большим блоком произнесите:

state_abbreviation.chomp!

В качестве альтернативы превосходному предложению sepp2k использовать case, рассмотрите возможность создания хэша с аббревиатурами состояний в качестве ключей.

0 голосов
/ 12 ноября 2010

Пока мы не в теме и комментируем подход и проблему, ознакомьтесь с этой подборкой рельсов. Он тянет все государственные сокращения с веб-сайта. Я фанат этого, потому что он полностью выводит отображения из вашего кода (хотя на всякий случай может быть хорошей идеей сохранить сайт). Затем вы можете поместить это вместе с кешем, чтобы предотвратить фактическое попадание в БД.

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

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

0 голосов
/ 07 января 2010

Вы используете get, и, возможно, ваша оболочка / ввод добавляет символ новой строки (\ n) в конце строки, и, возможно, вы захотите использовать оператор case:

пример:

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
0 голосов
/ 07 января 2010

gets возвращает то, что вы ввели с новой строки. Попробуйте state_abbreviation = gets.chomp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...