Почему возникает ошибка при передаче аргументов в мой ruby ​​script?

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

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

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

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

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

Ответы

Ответ 1

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

$stdin.gets

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

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

ARGV.clear

Затем вы сможете бесплатно gets без чтения из файлов, которые вы, возможно, не хотели читать.

Ответ 2

Весь смысл Kernel#gets заключается в том, чтобы обрабатывать аргументы, переданные программе как имена файлов, и читать эти файлы. Самое первое предложение в документация гласит:

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

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