当参数传递给我的ruby脚本时,为什么会抛出错误?

时间:2010-01-30 04:31:05

标签: ruby gets

我正在使用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 个答案:

答案 0 :(得分:24)

Ruby会自动将未解析的参数视为文件名,然后打开并读取文件,使输入可用于ARGF$<)。默认情况下,gets从ARGF读取。绕过那个:

$stdin.gets

有人建议您使用STDIN代替$stdin,但通常是better to use $stdin

此外,在您从ARGV捕获所需的输入后,您可以使用:

ARGV.clear

然后,如果没有阅读您可能无意阅读的文件,您将可以自由gets

答案 1 :(得分:4)

Kernel#gets整点是将传递给程序的参数视为文件名并读取这些文件。 the documentation中的第一句话是:

  

返回(并指定$ _)ARGV(或$ *)中文件列表中的下一行

这就是gets的工作原理。如果您想从特定的 IO对象(例如$stdin)中进行阅读,只需在该对象上调用gets即可。