我可以使用Ruby';s OptionParser是否接受任意参数模式?

我可以使用Ruby';s OptionParser是否接受任意参数模式?,ruby,command-line-arguments,optionparser,Ruby,Command Line Arguments,Optionparser,假设我有一个简单的Ruby应用程序,其中我希望第一个参数(如果有)指定环境:TEST、DEVELOPMENT或PRODUCTION(如果没有给出参数,DEVELOPMENT是默认值)。比如说, ruby myapp.rb test 将在TEST模式下运行它。此外,还应接受速记,例如 ruby myapp.rb t 将在TEST模式下运行应用程序,然后 ruby myapp.rb dev 将在开发模式下运行它 我想使用,但它的行为非常奇怪。如果myapp.rb是 require 'optpa

假设我有一个简单的Ruby应用程序,其中我希望第一个参数(如果有)指定环境:
TEST
DEVELOPMENT
PRODUCTION
(如果没有给出参数,
DEVELOPMENT
是默认值)。比如说,

ruby myapp.rb test
将在
TEST
模式下运行它。此外,还应接受速记,例如

ruby myapp.rb t
将在
TEST
模式下运行应用程序,然后

ruby myapp.rb dev
将在
开发
模式下运行它

我想使用,但它的行为非常奇怪。如果myapp.rb是

require 'optparse'

environment = 'DEVELOPMENT'
opts = OptionParser.new
opts.on('test')        { environment = 'TEST' }
opts.on('production')  { environment = 'PRODUCTION' }
opts.parse!(ARGV)
然后,无论我传递什么参数,环境都变成了生产环境;出于某种原因,
opts.on('production')
始终执行其块。(如果我使用像
'-production'
这样的标志样式字符串,则不会出现这种情况。)而且我无法让OptionParser查找以“t”开头的字符串,而不是确切的字符串“test”


也许OptionParser是这个工作的错误工具。显然,我自己拆分ARGV是微不足道的。我只是想知道这种行为是怎么回事。我使用的是Ruby 1.9.2。

我想说,在运行OptionParser之前,您需要从ARGV中解析出类似的参数

e、 g


另外,我推荐特罗洛普。我发现它更简单,而且选择默认值也很好。

如果您使用
解析opts.on
调用处理的任何参数都将从
ARGV
数组中以破坏性方式剥离。这意味着
ARGV
数组的原始内容在
解析之后将不再包含这些标志方法

我建议通过将ARGV与包含“test”和“production”的数组进行比较,手动解析剩余的参数集

查看文档:

env = ARGV.select{|arg| arg =~ /dev/test/prod/i}.first