当我将参数传递给我的脚本时,使用GETS()会给出“没有这样的文件或目录”错误

b4wnujal  于 2022-10-15  发布在  Ruby
关注(0)|答案(3)|浏览(194)

您好,我正在制作一个简单的ruby脚本,其中我使用gets.chomp和参数创建了一个表单,问题是当gets.chomp使用时,脚本在我应用参数test时返回错误。
代码:


# !usr/bin/ruby

def formulario(quien)
    while (1)
        print "[+] Word : "
        word = gets.chomp
        print quien + " -> " + word
    end
end

quien = ARGV[0]

formulario(quien)

错误:

[+] Word : C:/Users/test/test.rb:8:in `gets': No such file or directory @ rb_sysopen - test (Errno::E
NOENT)
        from C:/Users/test/test.rb:8:in `gets'
        from C:/Users/test/test.rb:8:in `formulario'
        from C:/Users/test/test.rb:17:in `<main>'

有人能帮忙吗?

zy1mlcev

zy1mlcev1#

看起来您想让用户通过读取STDIN中的一行来输入一些输入,最好的方法是调用STDIN.gets而不是gets。所以你的台词变成了:

word = STDIN.gets.chomp

这被记录为IO.getsSTDINIO的示例。
现在,您正在执行Kernel.gets,它做了一些不同的事情(重点是我的):
返回(并分配给$_)ARGV中文件列表(或$)中的下一行,如果命令行上没有文件,则返回来自标准输入的
如果ARGV为空,则这
看起来*行为类似于STDIN.gets,但不是一回事,因此产生了混淆。

hof1towb

hof1towb2#

如果您程序处理空参数或非空参数。您可以使用此模块(特别是如果您已经在任何地方使用默认的gets)


# A module that help to use method gets no matter what the file argument is

module InputHelper
    # Handle input method based on its file argument
    def gets
        if ARGV.nil?
            Kernel.gets
        else
            STDIN.gets
        end
    end
end

然后你可以把它放在你的班级里

require 'input_helper'
class YourClass
    ...
    include InputHelper
    ...
end
qmelpv7a

qmelpv7a3#

我今天在Ruby 3.1.2中遇到了这个问题。我还可以确认,STDIN.GETS避免了这个问题。另一种解决方法是在通过GET捕获输入之前将ARGV设置为空数组。您可以简单地设置

ARGV = []
gets.chomp # works fine here

或者,如果您必须在处理完它们之前获得输入,则将它们存储在其他地方

cli_args = ARGV.dup
ARGV.clear
gets.chomp # works fine here

相关问题