当参数传递给我的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()没有帮助)。

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

 $stdin.gets 

有人建议您可以使用STDIN而不是$stdin ,但通常使用$stdin会更好 。

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

 ARGV.clear 

然后你就可以自由地从你可能没有读过的文件中读取它。

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

从ARGV(或$ *)中的文件列表返回(并分配给$ _)下一行

这就是如何运作。 如果要从特定 IO对象(例如$stdin )读取,只需调用该对象上的gets