也许这会帮助:
require 'optparse'
VERSION = '1.0.0'
options = {}
OptionParser.new do |opt|
opt.on('-f', '--foo', 'Foo it') { |o| options[:foo] = o }
opt.on_tail('-v', '--version') do
puts VERSION
exit
end
end.parse!
puts options
将其保存为 “test.rb” 并运行它与ruby test.rb
回报:
{}
用ruby test.rb -f
或--foo
运行它返回:
{:foo=>true}
与ruby test.rb -v
或--version
返回运行它:
1.0.0
更多的乐趣,运行ruby test.rb -h
或--help
回报:
Usage: test [options]
-f, --foo Foo it
即使我没有定义-h
或--help
。
如果我想要的-v
和--version
标志出现在列表中,那么我他们从on_tail
方法更改为正常on
方法:
require 'optparse'
VERSION = '1.0.0'
options = {}
OptionParser.new do |opt|
opt.on('-f', '--foo', 'Foo it') { |o| options[:foo] = o }
opt.on('-v', '--version', 'Returns the version') do
puts VERSION
exit
end
end.parse!
puts options
这将返回:
Usage: test [options]
-f, --foo Foo it
-v, --version Returns the version
我可以添加:
puts ARGV
到脚本的末尾,看到OptionParser正确处理标志和参数:
>ruby test.rb bar --foo
{:foo=>true}
bar
>ruby test.rb --foo bar
{:foo=>true}
bar
请参阅“Pass variables to Ruby script via command line”的详细信息。
您的示例代码无法使用--options
来处理您的示例输入。没有定义--options
的处理程序。也不是subtext
。您的代码返回:
undefined local variable or method `subtext' for main:Object (NameError)
剥块:
global = OptionParser.new do |opts|
opts.on("-v", "--version", "Print the version") do |v|
options[:version] = v
end
end
和运行再次返回:
invalid option: --options (OptionParser::InvalidOption)
所以,再一次,你的榜样不匹配的结果,你说你正在得到。
你可以添加你的实际代码吗?你链接到的例子确实允许你的'ruby main.rb --version'的情况,所以没有看到你的代码,我们不能调试这个问题。 – jkeuhlen
@jkeuhlen该代码与我发布的URL完全相同,除了“--verbose”替换为“--version”,代码原本就是抛出一个“nil:NilClass(NoMethodError)如果它不遵循'program [[options] [subcommand] [options]]'格式 – user2840647