代码之家  ›  专栏  ›  技术社区  ›  TIMBERings

ruby optionparser未正确解析命令

  •  3
  • TIMBERings  · 技术社区  · 8 年前

    这是OptionParser的精简版本

        OptionParser.new do |opts|
          opts.on('-f', '--format FORMAT', 'output format (text, html, yml, json, xml)') do |format|
            options['format'] = format
          end
        end
    

    这里是格式选项的试用版

    [16] pry(main)> parse("-f s")
    => {"format"=>" s"}
    [17] pry(main)> parse("--format s")
    OptionParser::InvalidOption: invalid option: --format s
    

    为什么不 --format s 工作?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Simple Lime    8 年前

    当你打电话 parse 手动,您需要传入 ARGV ,它不是脚本名称后面的所有字符串,而是拆分数组:

    ./example.rb -f s       # => ["-f", "s"]
    ./example.rb --format s # => ["--format", "s"]
    ./example.rb --format=s # => ["--format=s"]
    

    因此,如果我们将这些格式传递给parse,就可以正确解析选项:

    op.parse(['-f', 'a'])       # => {"format"=>"a"}
    op.parse(['--format', 'b']) # => {"format"=>"b"}
    op.parse(['--format=c'])    # => {"format"=>"c"}
    
        2
  •  2
  •   Bartosz Pietraszko    8 年前

    可能不行,因为 .parse 方法应将参数数组作为参数(而不是字符串)接收一旦你把你的 OptionParser 在一个真实的脚本中 .parse(ARGV) ,两者 --format s --format==s 长样式开关的变体应该可以工作。

    opt.rb脚本:

    require 'optparse' 
    
    options = {}
    parser = OptionParser.new do |opts|
      opts.on('-f', '--format FORMAT', 'output format (text, html, yml, json, xml)') do |format|
        options['format'] = format
      end 
    end
    parser.parse(ARGV)
    p options
    

    用法:

    ~ ruby opt.rb -f s  
    {"format"=>"s"}
    ~ ruby opt.rb --format s
    {"format"=>"s"}
    ~ ruby opt.rb --format=s
    {"format"=>"s"}
    
    推荐文章