Ruby OptionParser 未正确解析 -- 命令
Ruby OptionParser not parsing -- commands properly
这是 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
不起作用?
它可能不起作用,因为 .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"}
手动调用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"}
这是 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
不起作用?
它可能不起作用,因为 .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"}
手动调用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"}