我正在使用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()
没有帮助)。
答案 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
即可。