Почему выдает ошибку, когда аргументы передаются в мой скрипт ruby? - PullRequest
14 голосов
/ 30 января 2010

Я использую 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 (таким образом, он удаляет вещи, которые он анализирует из списка аргументов), тогда приложение работает нормально.

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

Ответы [ 2 ]

24 голосов
/ 30 января 2010

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

$stdin.gets

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

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

ARGV.clear

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

4 голосов
/ 30 января 2010

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

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

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

...