Ruby IF没有给出ARGV

Ba7*_*chy 15 ruby

这是我的代码:

if ARGV[0] == false
    puts "Usage: ./script.rb argument"
    exit
end
print "Yey we got an argument: " ARGV[0]
Run Code Online (Sandbox Code Playgroud)

但我不能让代码检查是否给出了ARGV [0],我应该怎么做?

Dav*_*ton 31

检查它是否empty?(或检查其长度):

if ARGV.empty?
  puts ...
  exit
end
Run Code Online (Sandbox Code Playgroud)

考虑使用任何Ruby命令行参数解析器,如OptionParser.


Way*_*rad 8

处理位置参数的最简单方法(除了使用gem来执行此操作)是它们一次一个地移开:

arg1 = ARGV.shift
arg2 = ARGV.shift
Run Code Online (Sandbox Code Playgroud)

缺少的论点将是零.让我们利用它来给arg2一个默认值:

arg1 = ARGV.shift
arg2 = ARGV.shift || 'default value goes here'
Run Code Online (Sandbox Code Playgroud)

检查必需的参数是微不足道的:

raise "missing argument" unless arg1
Run Code Online (Sandbox Code Playgroud)

如果提供的参数太多,也很容易看出:

raise "too many arguments" unless ARGV.empty?
Run Code Online (Sandbox Code Playgroud)

  • @KomodoDave - Ruby只将字符串放入ARGV (2认同)

Mar*_*uis 6

我意识到已经给出了一个很好的解决方案,但没有人提到您的示例不起作用的真正原因。

您的示例代码的问题是,如果没有给出参数,ARGV[0]将返回nil, 并且nil == false为 false。nil是“假”,但不等于假。你本来可以做的是:

unless ARGV[0]
  puts "Usage: ..."
  exit 1
end
Run Code Online (Sandbox Code Playgroud)

这本来是有效的,因为这个陈述现在取决于虚假,而不是与实际的相等false

但不要使用这段代码,如果您陈述您的实际意图,那就更清楚了,即您想知道是否有任何参数(而不是第一个参数是否为假)。所以使用其他人建议的代码:

if ARGV.empty?
  puts "Usage..."
  exit 1
end
Run Code Online (Sandbox Code Playgroud)