В Ruby getoptlong деструктивно анализирует ARGV. Это можно обойти? - PullRequest
3 голосов
/ 01 декабря 2008

Мне нужно вызывать getoptlong несколько раз, но после первого раза ARGV пуст.

1 Ответ

4 голосов
/ 01 декабря 2008

Захватите арги перед первым вызовом, положите их обратно, когда вы закончите. Похоже, вы делаете что-то странное.

Редактировать : (расширен)

Здесь много копий и вставок. Я считаю, что помогает с ясностью:

require 'getoptlong'

storage = ARGV.clone

opts = GetoptLong.new(
  ['--help', '-h', GetoptLong::NO_ARGUMENT ],
  [ '--repeat', '-n', GetoptLong::REQUIRED_ARGUMENT ],
  [ '--name', GetoptLong::OPTIONAL_ARGUMENT ]
)

puts "Before: #{ARGV.inspect}"
opts.each { |opt, arg| puts "Parsed #{opt} = #{arg}" }
puts "After: #{ARGV.inspect}"

# Copy
storage.each {|x| ARGV << x }

opts = GetoptLong.new(
  ['--help', '-h', GetoptLong::NO_ARGUMENT ],
  [ '--repeat', '-n', GetoptLong::REQUIRED_ARGUMENT ],
  [ '--name', GetoptLong::OPTIONAL_ARGUMENT ]
)

puts "Before 2: #{ARGV.inspect}"
opts.each { |opt, arg| puts "Parsed #{opt} = #{arg}" }
puts "After 2: #{ARGV.inspect}"
...