2010-01-30 9 views
14

Estoy usando gets para pausar la salida de mi script hasta que el usuario presione la tecla Intro. Si no paso ningún argumento a mi script, funciona bien. Sin embargo, si me pasa ningún argumento a mi guión después consigue matrices con el siguiente error:¿Por qué se lanza un error cuando los argumentos se pasan a mi script de ruby?

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

mensaje El error está mostrando el argumento pasé a la secuencia de comandos. ¿Por qué debería estar mirando a ARGV?

Estoy usando OptionParser para analizar mis argumentos de línea de comandos. Si uso parse! en lugar de parse (por lo que elimina cosas que analiza de la lista de argumentos), entonces la aplicación funciona bien.

Parece que get está leyendo de ARGV por alguna razón. ¿Por qué? Es esto esperado? ¿Hay alguna manera de hacer que no haga eso? (Hacer gets() no ayudó).

Respuesta

22

Ruby tratará automáticamente los argumentos no analizados como nombres de archivos, luego abrirá y leerá los archivos haciendo que la entrada esté disponible en ARGF ($<). Por defecto, gets lee de ARGF. Para pasar por alto que:

$stdin.gets 

Se ha sugerido que se puede utilizar en lugar de STDIN$stdin, pero por lo general es better to use $stdin.

Además, después de capturar la entrada que desea de ARGV, puede utilizar:

ARGV.clear 

, entonces estará libre de gets sin ella la lectura de los archivos puede que no haya intención de leer.

4

El punto entero de Kernel#gets es para tratar los argumentos pasados ​​al programa como nombres de archivo y leer esos archivos. La primera frase en the documentation lee:

Returns (and assigns to $_) the next line from the list of files in ARGV (or $*)

así es como gets obras. Si desea leer un objeto específicoIO (por ejemplo, $stdin), simplemente llame al gets en ese objeto.

Cuestiones relacionadas