gpt4 book ai didi

ruby - OptionParser 的 make_switch 错误 '-?'

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:17 26 4
gpt4 key购买 nike

我遇到了 OptionParser 的 make_switch 问题。

我的代码解析三个参数并运行测试以查看我的 MANDATORY 参数是否在此处:

 #!/usr/bin/env ruby

require 'optparse'
require 'ostruct'

options = OpenStruct.new
@argv = ARGV

optparse = OptionParser.new do |opts|

@opts=opts

usage = "USAGE: ./#{File.basename($0)} [-v] -p xxxxxx"
@opts.banner = usage

@opts.on( '-p', '--pdu [PDU]', 'Specify a PDU to configure') do |res|
options.pdu = true
$pdu_name = res
end

@opts.on( '-v', '--[no-]verbose', 'Run verbosely') do
options.verbose = true
end

@opts.on( '-?', '-help','Show this message') do
puts "Help Me!"
puts @opts
exit 1
end
end

begin
if not @argv.empty?
optparse.order!(@argv)
if !options.pdu
$stderr.puts "Options -p missing."
$stderr.puts "#{@opts}\n\n"
exit 1
end
else
$stderr.puts "ERROR: Arguments Required."
$stderr.puts "#{@opts}\n\n"
exit 1
end
rescue OptionParser::InvalidOption
$stderr.puts "ERROR: Invalid option."
$stderr.puts "#{@opts}\n\n"
exit 1
end

-? 外一切正常:

xxx$ ./myscript.rb -?
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:451:in
`parse': missing argument: -? (OptionParser::MissingArgument)
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1295:in `parse_in_order'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1254:in `catch'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1254:in `parse_in_order'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1248:in `order!'
blabla

然而 -help 完美运行:

xxxx$ ./myscript.rb -help
Help me!
USAGE: ./myscript.rb [-v] -p xxxxxx
-p, --pdu [PDU] Specify a PDU to configure
-v, --[no-]verbose Run verbosely
-?, -help Show this message

更令人惊讶的是,-? -v 也适用:

xxxx$ ./myscript.rb -? -v
Help Me!
USAGE: ./myscript.rb [-v] -p xxxxxx
-p, --pdu [PDU] Specify a PDU to configure
-v, --[no-]verbose Run verbosely
-?, -help Show this message

我做错了什么?

如果我将代码中的 -? 替换为 -h,也会出现同样的问题。

最佳答案

也许快速浏览一下(有些令人困惑的)文档可以对情况有所了解。如果您查看文档,您最终会找到 OptionParser#make_switch。您可以在其中找到对 opt.on 参数的解释:

Long style switch:
Specifies a long style switch which takes a mandatory, optional or no argument. It’s a string of the following form:

"--switch=MANDATORY" or "--switch MANDATORY"
"--switch[=OPTIONAL]"
"--switch"

Short style switch:
Specifies short style switch which takes a mandatory, optional or no argument. It’s a string of the following form:

"-xMANDATORY"
"-x[OPTIONAL]"
"-x"

注意 -xMANDATORY,然后仔细查看您的 @opts.on 调用:

@opts.on( '-?', '-help','Show this message') do
# ---------------^^^^^

那个 -help 定义了一个带有必需的 elp 参数的 -h 选项。大概选项解析器正在解释这意味着 -h-? 的别名,并且由于 -h 是用必需的参数定义的, -? 也需要一个参数。如果您使用 --help(即长样式开关),那么您可能会有更好的时间:

@opts.on('-?', '--help', 'Show this message') do

我使用的是 Ruby 2.0 版本,但我怀疑选项解析器自您似乎使用的旧版本 Ruby 以来发生了很大变化。

关于ruby - OptionParser 的 make_switch 错误 '-?',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19937285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com