Ruby ARGV数组搜索

时间:2014-03-17 16:15:29

标签: ruby argv

我在搜索ARGV中传递了哪些选项时遇到了一些问题。我有,

if ARGV.include? '-v' == true
    puts "Do junk"
else
    puts "Nope"
end

这似乎是一个非常简单的事情,但是当我放置“-v”或者当我不放置时,我总是得到“Nope”。我在这里错过了一些简单的东西吗?

4 个答案:

答案 0 :(得分:3)

我不知道这是不是你的问题,但你不需要== true

if ARGV.include? '-v'
  puts "Do junk"
else
  puts "Nope"
end

include?方法返回truefalse

答案 1 :(得分:3)

您为什么要搜索ARGV的选项?使用标准库的OptionParser类,这是为此而创建的。

require 'optparse'
require 'pp'

options = {}
OptionParser.new { |opt|
  opt.on('-v', '--verbose', 'Be verbose') { |o| options[:verbose] = o }
}.parse!

pp options

保存,并使用以下内容运行:ruby test.rb -vruby test.rb --verbose,您会看到:

{:verbose=>true}

使用ruby test.rb -hruby test.rb --help运行它,您会看到:

Usage: test [options]
    -v, --verbose                    Be verbose

OptionParser具有各种漂亮(和智能)技巧,用于设置布尔值,必需参数,强制值,以便您可以为作为数组返回的参数获取多个值,等等。请注意,它为我创建了帮助,包括使用-h--help作为标志。

查看文档中的示例,了解它可以做些什么的其他想法。

答案 2 :(得分:2)

这是一个优先问题。写为'

if ARGV.include?('-v') == true
  puts "Do junk"
else
  puts "Nope"
end

在您的情况下,if ARGV.include? '-v' == true被解释为if ARGV.include? ('-v' == true)。现在'-v' == true返回falsefalse数组中不包含ARGV,因此if评估为falseelse部分正在执行。

最好写为

if ARGV.include? '-v'
  puts "Do junk"
else
  puts "Nope"
end

因为ARGV是一个数组,而Array#include?(ob)返回true,如果在数组中找到了ob

答案 3 :(得分:0)

到目前为止,所有其他答案都是正确的,因为它是一个优先问题。

以下是一些有用的注释,其中第一个已被触及:

  1. 您不需要== true,因为include?方法已经返回true或false。

  2. 对于解析命令行参数,您可能会发现使用像Trollop这样的库更直观。使用Trollop,您的示例可以这样完成:

    require 'trollop'
    opts = Trollop::options do
      opt :verbose, "Run verbosely"  # (-v is created automatically from this)
    end
    
    if opts[:v] 
      puts "yes" 
    else
      puts "no"
    end
    
  3. (编辑:另见Tin Man的回答:optparse)