Рубин О циклах и равенстве строк

Почему это не работает?

puts "Hi"

x = "stop"

loop do
  a = STDIN.gets
  break if a.to_s.downcase.equal?x.to_s
end

puts "bye"

2 ответа

Решение

Так как gets будет включать клавишу Enter, используемую в конце того, что вы вводите в него.

a = gets # I type in "stop"
a == "stop\n" #=> true

Чтобы это исправить, chopс новой строки

puts "Hi"

x = "stop"

loop do
  a = STDIN.gets.chop
  break if a.to_s.downcase == x.to_s
end

puts "bye"

Есть две причины.

Первый equal? это очень сильная форма равенства: по умолчанию это эквивалентно сравнению идентификаторов объектов, поэтому две строки, имеющие одинаковое содержимое, но не одинаковые объекты, не будут равны. Вы, вероятно, хотите использовать == вместо

во-вторых gets будет включать новую строку, которую вы ввели, которую вы можете удалить chop или же chomp

Другие вопросы по тегам