2013-02-12 4 views
1

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

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 

Ошибка Метательное: `получает: Нет такого файла или каталога (Errno :: ENOENT)

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

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

+0

«но получает броски и ошибки. Почему это». Если вы не сообщите нам, что такое ошибка (и на какой строке), как мы должны знать, что произошло и почему? –

+0

Добавил это, когда вы набрали этот комментарий ;-) – AnthonyW

ответ

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, «просто чтобы быть уверенным». В таких случаях, когда возможно необычное и удивительное поведение, почти всегда лучше писать код как можно более явным образом.

+0

Отлично! Только то, что мне нужно! Есть ли способ сбросить дополнительные аргументы, если какой-нибудь пользователь knucklehead добавляет несколько? – AnthonyW

+0

Мне жаль, что я должен согласиться с вашим советом по явному коду. Это будет стоить мне набирать Whopping SIX дополнительных символов, каждый получает statment tho. * ворчать ворчать ворчать * Спасибо за вашу помощь !! – AnthonyW

+0

Метод 'clear' экземпляра' Array' - лучший способ, который я могу придумать с головы. – mdunsmuir

0

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

STDIN.gets

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

Смежные вопросы