Допустим, у меня есть простое приложение на Ruby, в котором я хочу, чтобы первый аргумент (если есть) определял среду: TEST
, DEVELOPMENT
или PRODUCTION
(с DEVELOPMENT
по умолчанию, если аргумент отсутствует дано). Например,
ruby myapp.rb test
будет запускать его в режиме TEST
. Кроме того, сокращения должны быть приняты, например,
ruby myapp.rb t
будет запускать приложение в режиме TEST
и
ruby myapp.rb dev
будет запускать его в режиме DEVELOPMENT
.
Я бы хотел использовать OptionParser , но он ведет себя очень странно. Если myapp.rb равен
require 'optparse'
environment = 'DEVELOPMENT'
opts = OptionParser.new
opts.on('test') { environment = 'TEST' }
opts.on('production') { environment = 'PRODUCTION' }
opts.parse!(ARGV)
тогда среда становится PRODUCTION
независимо от того, какие аргументы я передаю; по какой-то причине opts.on('production')
всегда выполняет свой блок. (Это не так, если я вместо этого использую строку в стиле флага, например '-production'
.) И я не вижу способа, чтобы OptionParser искал строки, начинающиеся с 't', а не точную строку 'test'.
Возможно, OptionParser - не тот инструмент для этой работы. Очевидно, было бы тривиально разделить ARGV самостоятельно. Мне просто интересно, что происходит с этим поведением. Я на Ruby 1.9.2.