我在搜索ARGV中传递了哪些选项时遇到了一些问题。我有,
if ARGV.include? '-v' == true
puts "Do junk"
else
puts "Nope"
end
这似乎是一个非常简单的事情,但是当我放置“-v”或者当我不放置时,我总是得到“Nope”。我在这里错过了一些简单的东西吗?
答案 0 :(得分:3)
我不知道这是不是你的问题,但你不需要== true
。
if ARGV.include? '-v'
puts "Do junk"
else
puts "Nope"
end
include?
方法返回true
或false
。
答案 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 -v
或ruby test.rb --verbose
,您会看到:
{:verbose=>true}
使用ruby test.rb -h
或ruby 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
返回false
,false
数组中不包含ARGV
,因此if
评估为false
,else
部分正在执行。
最好写为
if ARGV.include? '-v'
puts "Do junk"
else
puts "Nope"
end
因为ARGV
是一个数组,而Array#include?(ob)
返回true
,如果在数组中找到了ob
。
答案 3 :(得分:0)
到目前为止,所有其他答案都是正确的,因为它是一个优先问题。
以下是一些有用的注释,其中第一个已被触及:
您不需要== true
,因为include?
方法已经返回true或false。
对于解析命令行参数,您可能会发现使用像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
(编辑:另见Tin Man的回答:optparse)