当我向我的脚本传递参数时,使用gets()会导致“没有此文件或目录”错误。

62

嗨,我正在编写一个简单的 Ruby 脚本练习,在其中使用 gets.chomp 和参数创建一个表单。问题在于,当我应用参数test时,gets.chomp导致脚本返回错误。

代码:

#!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>'

有谁能帮忙吗?


3
与您的问题无关,但 #!usr/bin/ruby 缺少前导斜杠 /;它应该是 #!/usr/bin/ruby ... 这仅适用于类UNIX系统,并且在Windows上不太常用(除了CygWin)。 - Martin Tournoij
3个回答

116

看起来你想通过读取STDIN输入一些内容,最好的方法是调用STDIN.gets而不是gets。所以你的代码应该是:

word = STDIN.gets.chomp

这个函数被记录为IO.getsSTDINIO类的一个实例。

现在,您正在执行Kernel.gets,它执行的是不同的操作(重点在此):

从ARGV中的文件列表(或$ *)或命令行上没有文件存在时从标准输入返回下一行,并将其分配给$_。

如果ARGV为空,则此函数看起来会像STDIN.gets一样运行,但实际上它们是不同的,因此会产生混淆。


gets默认从STDIN读取,因此不需要使用STDIN.gets - the Tin Man
14
@theTinMan 我遇到了完全相同的错误,指定 STDIN 对我有用。 - Joshua Pinter
1
我可以确认,使用 STDIN.gets 取代原来的方法也解决了我的同样问题。 - Harlin
谢谢。意料之外的便利可能会导致奇怪的地方。我认为这种行为很奇怪,但如果我习惯了它,我可能会发现它很方便。 - nc.
2
奇怪,我不知道 ARGV 会干扰 .gets 方法。这个答案对我也起作用了。 - infinite-etcetera
重点是,如果您使用命令行参数运行程序,则需要指定STDIN - BobRodes

0
今天我在 Ruby 3.1.2 中遇到了这个问题。我可以确认 STDIN.gets 可以避免这个问题。另一个解决方法是在使用 gets 捕获输入之前将 ARGV 设置为空数组。你可以简单地设置。
ARGV = []
gets.chomp # works fine here

或者如果你必须在处理完它们之前获取输入,可以将它们存储在其他地方

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

0
如果你的程序可以处理空参数或非空参数,那么你可以使用这个模块(特别是如果你已经在所有地方使用默认的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

这个模块中存在一个错误。当没有提供参数时,ARGV是一个空数组[],并且永远不会为nil,因此条件语句将始终为false并且始终执行STDIN.gets。 - Scott

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