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