Почему выдает ошибку, когда аргументы передаются в мой скрипт ruby?

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

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() не помогло).

2 ответа

Решение

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

$stdin.gets

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

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

ARGV.clear

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

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

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

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

Другие вопросы по тегам