Почему выдает ошибку, когда аргументы передаются в мой скрипт 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
на этом объекте.