为什么在我的Ruby脚本中传递参数时,gets会抛出错误?

16

我正在使用 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'
    ...
错误消息显示了我传递给脚本的参数。为什么 gets 要查看 ARGV?
我正在使用 OptionParser 解析命令行参数。如果我使用 parse! 而不是 parse(这样它会从参数列表中删除解析的内容),那么应用程序就可以正常工作。
因此,看起来 gets 以某种原因从 ARGV 中读取。这是预期的吗?是否有办法使其不这样做(使用 gets() 没有帮助)?
2个回答

30
Ruby会自动将未解析的参数作为文件名处理,然后打开和读取这些文件,并使其输入可供ARGF ($<) 使用。默认情况下,gets从ARGF读取。要绕过此功能:
$stdin.gets

有人建议使用STDIN而不是$stdin,但通常更好的做法是使用$stdin

此外,在捕获ARGV中想要的输入后,可以使用:

ARGV.clear

那么你就可以自由地使用gets函数,而不会从一些你没有意图读取的文件中读取内容。


4
< p > Kernel#gets 的整个目的是将传递给程序的参数视为文件名并读取这些文件。在文档中,第一句话是:

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

这就是 gets 的工作原理。如果您想从特定的 IO 对象(例如,$stdin)读取,请在该对象上调用 gets


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接