Em Ruby, getoptlong destrutiva analisa ARGV. Existe uma maneira de contornar isso?

StackOverflow https://stackoverflow.com/questions/330008

  •  11-07-2019
  •  | 
  •  

Pergunta

Eu preciso invocar getoptlong várias vezes, mas depois da primeira vez ARGV está vazio.

Foi útil?

Solução

Capture os argumentos antes da primeira chamada, colocá-los de volta quando você está feito. Parece que você está fazendo algo meio estranho, no entanto.

Editar : (expandido)

Há um monte de copiar e colar aqui. Eu considero que ajudar com clareza:

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}"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top