16

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(因此它会从参数列表中删除它解析的内容),那么应用程序可以正常工作。

因此,出于某种原因,gets 似乎正在从 ARGV 读取数据。为什么?这是预期的吗?有没有办法让它不这样做(这样gets()做没有帮助)。

4

2 回答 2

28

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

$stdin.gets

有人建议您可以使用STDIN代替$stdin,但通常最好使用$stdin.

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

ARGV.clear

然后,您可以自由地gets从您可能不打算阅读的文件中读取它。

于 2010-01-30T04:55:35.853 回答
4

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

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

这就是gets工作原理。如果您想读取特定 IO对象(例如$stdin),只需调用gets该对象即可。

于 2010-01-30T04:56:49.970 回答