То, почему, получает бросок ошибки, когда аргументы передаются моему рубиновому сценарию?

Я использую gets приостанавливать вывод моего сценария, пока пользователь не поражает клавишу Enter. Если я не передаю аргументов своему сценарию тогда, он хорошо работает. Однако, если я передаю какие-либо аргументы своему сценарию, тогда добирается, умирает со следующей ошибкой:

ruby main.rb -i
main.rb:74:in `gets': No such file or directory - -i (Errno::ENOENT)
    from main.rb:74:in `gets'
    ...

Сообщение об ошибке показывает аргумент, который я передал сценарию. Почему был бы добираться посмотреть на ARGV?

Я использую OptionParser для парсинга моих параметров командной строки. Если я использую parse! вместо parse (таким образом, это удаляет вещи, которые это анализирует из списка аргументов), тогда, приложение хорошо работает.

Таким образом, это похоже, добирается, читает из ARGV по некоторым причинам. Почему? Это ожидается? Есть ли способ заставить это не делать это (выполнение gets() не помог).

14
задан Herms 30 January 2010 в 04:31
поделиться

2 ответа

Ruby автоматически лечит непростые аргументы в качестве имена файлов, а затем открывают и прочитали файлы, делающие вход, доступные для ARGF ( $ <). По умолчанию получает чтения из ARGF. Чтобы обойти это:

$stdin.gets

было предложено, чтобы вы могли использовать stdin вместо $ stdin , но это обычно лучше использовать $ stdin Отказ

Дополнительно после того, как вы будете захватывать нужный ввод из ARGV , вы можете использовать:

ARGV.clear

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

24
ответ дан 1 December 2019 в 09:32
поделиться

Точка из ядра # - это лечение аргументов, передаваемых программе в качестве имена файлов и прочитайте эти файлы. Самое первое предложение в Документация гласит:

возвращает (и назначает $ _) следующую строку из списка файлов в ARGV (или $ *)

, именно просто как Получает работает. Если вы хотите прочитать из , объекта IO (скажем, $ stdin ), просто вызовите на этом объекте .

4
ответ дан 1 December 2019 в 09:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: