我正在玩OptParse
并尝试让它正常运行,但是,现在我的所有选项都默认使用了use_page方法。我不确定为什么会发生这种情况,我试图将CHOICES
常数移到开始/救援条款的正上方,我还尝试使用{{1} }; start = OptParser.new
这些都不起作用。我也试过(从我的代码中可以看到)将options = start.parse_argv(ARGV)
和OptParser.new
分开,我有点困惑,可以使用一些帮助,为什么不是&#39我尝试过什么工作?我不明白,它要么告诉我它不是变量,不是方法,要么抛出使用页面?
(这是我试图帮助的开源project)
我的来源:
CHOICES = OptParse.parse_argv(ARGV)
答案 0 :(得分:1)
使用OptionParser非常简单,但是你很难解决这个问题。从这开始:
require 'optparse'
options = {}
OptionParser.new do |opt|
opt.on('-f', '--foo', 'Foo it') { |o| options[:foo] = o }
opt.on('-b', '--[no-]bar', 'Maybe bar it') { |o| options[:bar] = o }
opt.on('-i', '--int INTEGER', Integer, 'I want an integer') { |o| options[:int] = o }
opt.on('-o', '--float FLOAT', Float, 'I want a Float') { |o| options[:float] = o }
opt.on('-a', '--array INTEGER', Array, 'I want an Array') { |o| options[:array] = o }
end.parse!
puts options
并将其保存到test.rb,然后运行它:
$ ruby test.rb -h
Usage: test [options]
-f, --foo Foo it
-b, --[no-]bar Maybe bar it
-i, --int INTEGER I want an integer
-o, --float FLOAT I want a Float
-a, --array INTEGER I want an Array
所以内置的帮助有效。
$ ruby test.rb -f
{:foo=>true}
它会看到-f
标志。
$ ruby test.rb --bar
{:bar=>true}
它会看到--bar
标志。
$ ruby test.rb --no-bar
{:bar=>false}
它了解应该切换--bar
。
$ ruby test.rb --foo --no-bar
{:foo=>true, :bar=>false}
它理解两面旗帜。
$ ruby test.rb -i 1
{:int=>1}
是的,它强制"1"
为整数。
$ ruby test.rb -i 1.1
test.rb:10:in `<main>': invalid argument: -i 1.1 (OptionParser::InvalidArgument)
是的,它期待一个整数并得到一个浮动并抱怨。
$ ruby test.rb -o 1.1
{:float=>1.1}
$ ruby test.rb -o 1.0
{:float=>1.0}
对于漂浮物很满意。
$ ruby test.rb -o 1
{:float=>1.0}
将"1"
强加给Float。这很好。
$ ruby test.rb -a 1
{:array=>["1"]}
$ ruby test.rb -a 1,2
{:array=>["1", "2"]}
$ ruby test.rb -a 1,2,zed
{:array=>["1", "2", "zed"]}
它正确处理数组。
options
是设置的标志及其参数的一个很好的容器。使用它允许许多不同的分支逻辑方式。我倾向于使用这样的东西:
require 'optparse'
options = {}
OptionParser.new do |opt|
opt.on('-f', '--foo', 'Foo it') { |o| options[:foo] = o }
opt.on('-b', '--[no-]bar', 'Maybe bar it') { |o| options[:bar] = o }
opt.on('-i', '--int INTEGER', Integer, 'I want an integer') { |o| options[:int] = o }
opt.on('-o', '--float FLOAT', Float, 'I want a Float') { |o| options[:float] = o }
opt.on('-a', '--array INTEGER', Array, 'I want an Array') { |o| options[:array] = o }
end.parse!
str = case
when options.values_at(:foo, :bar).all?
'foo and bar'
when options.values_at(:int, :float, :array).one?
'one of int, float or array'
when options[:foo]
'foo'
when options[:bar]
'bar'
end
puts '%s set' % str
不要创建OptionParser类。当你打电话给#34; OptionParser&#34;你打开了这个类,然后你创建的任何方法都被添加到它中,可能会覆盖核心方法,打破了类。相反,使用块创建它的实例,然后在块的末尾使用parse!
来给它控制并让它找出传递给它的标志。
OptionParser类非常强大,因此文档可能会有点混乱,但这些示例会有所帮助。