Не удается получить правильный ввод с помощью STDIN.gets.chomp () в ruby - PullRequest
2 голосов
/ 11 февраля 2012

Я следую учебному пособию LearnRubyTheHardWay и испытываю трудности с изменением упражнения 29 . Все работает нормально, если я определяю переменные как (как в учебнике):

people = 100000
cats = 34
dogs = 56

Однако, если я попытаюсь получить переменные из STDIN, например:

puts "How many people are here?"
people = STDIN.gets.chomp()
puts "How many cats?"
cats = STDIN.gets.chomp()
puts "And how many dogs?"
dogs = STDIN.gets.chomp()

Операторы равенства возвращают ложные результаты, как если бы они только вычисляли результаты, используя первые две цифры чисел. Поэтому, если я набираю 100000000 для людей и 11, 12 или 13 для кошек, методы возвращают «Слишком много кошек ...». Если я набираю 150000000 для людей и что-либо <15 для кошек, они возвращают «Не много кошек ..» должны изменить </p>

dogs += 5

до

dogs += "5"

в противном случае я получаю следующую ошибку: в `+ ': невозможно преобразовать Fixnum в String (TypeError)

Если я оставлю двойные кавычки на месте и вернусь к людям = 10000, я получу следующую ошибку: в `+ ': невозможно привести строку в Fixnum (TypeError)

Скажем так, у меня нет проблем с кодом в учебнике, просто попробуйте узнать, что вызывает ошибки, вызванные методами STDIN. Я заглянул в RubyDoc.org , чтобы узнать, является ли это проблемой с классами fixnum, integer или string или чем-то связанным с методами chomp или gets, но не смог найти причину. Я также пытался to_i и to_s до или после, но не получил никакого результата.

Полный исходный код файла приведен ниже:

puts "How many people are here?"
people = STDIN.gets
puts "How many cats?"
cats = STDIN.gets
puts "And how many dogs?"
dogs = STDIN.gets

#people = 100000
#cats = 34
#dogs = 56

puts "So, %d people, %d cats and %d dogs, huh?" % [people,cats,dogs]

if people < cats
  puts "Too many cats! The world is doomed!"
end

if people > cats
  puts "Not many cats! The world is saved!"
end

if people < dogs
  puts "The world is drooled on!"
end

if people > dogs
  puts "The world is dry!"
end

dogs += "5"
puts "Now there are #{dogs} dogs."

if people >= dogs
  puts "People are greater than or equal to dogs."
end

if people <= dogs
  puts "People are less than or equal to dogs."
end

if people == dogs
  puts "People are dogs."
end

1 Ответ

3 голосов
/ 11 февраля 2012

Проблема в том, что STDIN.gets возвращает строку. Поэтому все операции сравнения будут работать со строками. Пример:

people = "100000000"
cats = "11"

puts people < cats  # => true!

Это потому, что < будет сравнивать строки лексикографически (а 1000... предшествует 11 в алфавите). На самом деле в вашем примере есть один момент, который делает совершенно очевидным, что здесь происходит:

dogs = STDIN.gets
dogs += "5"

Если вы введете 7 здесь, он должен распечатать 75. Видите ли, он просто объединяет строки.

Как это исправить? Легко, просто преобразуйте строки в целые числа:

puts "How many people are here?"
people = STDIN.gets.to_i
puts "How many cats?"
cats = STDIN.gets.to_i
puts "And how many dogs?"
dogs = STDIN.gets.to_i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...