Ошибка аргумента Ruby

Если я жестко запрограммирую переменную max ниже, моя программа запустится без проблем. Если я передаю аргумент, max устанавливает правильно, но получает броски и ошибку. Это почему?

max = ARGV[0].to_i

# Ask user for first guess
puts "I am thinking of a number between 1 and " + max.to_s + "."
print "Make your guess: "
guess = gets.chomp.to_i

Возникла ошибка: `gets': Нет такого файла или каталога (Errno:: ENOENT)

Примечание. Ошибка устраняется заменой gets на STDIN.gets, но зачем это нужно, если без аргумента моя программа работает нормально?

Кроме того, есть ли способ изменить поведение по умолчанию для get обратно на STDIN.gets для всего файла? Возможно, с одной строкой вверху программы?


person AnthonyW    schedule 12.02.2013    source источник
comment
но получает броски и ошибки. Почему это так? Если вы не сообщите нам, в чем ошибка (и в какой строке), как мы должны узнать, что произошло и почему?   -  person Sergio Tulentsev    schedule 12.02.2013
comment
Добавил, пока вы писали этот комментарий ;-)   -  person AnthonyW    schedule 12.02.2013


Ответы (2)


Kernel.gets имеет интересное поведение, объясняющее вашу проблему:

http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-gets

В частности, он ведет себя по-разному в зависимости от того, является ли ARGV пустым или нет, и если он не пуст, то он будет вести себя иначе, чем STDIN.gets. Если вы не хотите использовать STDIN.gets явно, вы можете использовать max = ARGV.shift для удаления этого элемента перед вызовом gets.

Отвечая на ваш последний вопрос: лучший способ заставить поведение gets соответствовать STDIN.gets, вероятно, состоит в том, чтобы убедиться, что ARGV пусто, прежде чем делать что-либо еще, и убедиться, что оно остается таким. Однако может быть разумнее продолжать просто использовать STDIN.gets, "просто для уверенности". В подобных случаях, когда возможно необычное и неожиданное поведение, почти всегда лучше писать код как можно более явно.

person mdunsmuir    schedule 12.02.2013
comment
Идеально! Как раз то, что мне было нужно! Есть ли способ сбросить дополнительные аргументы, если какой-то пользователь-болван добавит более одного? - person AnthonyW; 12.02.2013
comment
Я вынужден согласиться с вашим советом по явному коду. Это будет стоить мне ввода целых ШЕСТЬ дополнительных символов для каждого получения статуса. ворчать, ворчать, ворчать Спасибо за вашу помощь! - person AnthonyW; 12.02.2013
comment
Метод экземпляра clear для Array — это лучший способ, который я могу придумать навскидку. - person mdunsmuir; 12.02.2013

Вы должны использовать:

STDIN.gets

При попытке получить пользовательский ввод.

person BlackHatSamurai    schedule 12.02.2013