Ruby的OptionParser无法正确解析--命令

3
这是一个简化版本的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个回答

2
这可能行不通,因为.parse方法应该接收一个参数数组而不是一个字符串。一旦你将OptionParser放入实际脚本并使用.parse(ARGV),长格式开关的--format s--format==s变体都应该有效。 < p >opt.rb脚本:< /p >
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"}

2

当您手动调用parse时,您需要传递ARGV,这不是脚本名称后面的所有字符串,而是分割后的数组:

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

因此,如果我们将这些格式传递给解析器,我们可以正确解析选项:
op.parse(['-f', 'a'])       # => {"format"=>"a"}
op.parse(['--format', 'b']) # => {"format"=>"b"}
op.parse(['--format=c'])    # => {"format"=>"c"}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接