无论给出什么标志,Optparser默认为usage_page

时间:2016-04-09 16:23:53

标签: ruby optparse

我正在玩OptParse并尝试让它正常运行,但是,现在我的所有选项都默认使用了use_page方法。我不确定为什么会发生这种情况,我试图将CHOICES常数移到开始/救援条款的正上方,我还尝试使用{{1} }; start = OptParser.new这些都不起作用。我也试过(从我的代码中可以看到)将options = start.parse_argv(ARGV)OptParser.new分开,我有点困惑,可以使用一些帮助,为什么不是&#39我尝试过什么工作?我不明白,它要么告诉我它不是变量,不是方法,要么抛出使用页面?

(这是我试图帮助的开源project

我的来源:

CHOICES = OptParse.parse_argv(ARGV)

1 个答案:

答案 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类非常强大,因此文档可能会有点混乱,但这些示例会有所帮助。