2017-04-14 1 views
0

Sur la base de this réponse ont je le code ci-dessous qui donnePourquoi une variable locale non définie?

undefined local variable or method `username' for main:Object (NameError) 

Question

Je suppose que cela a fonctionné en 2014, si quelqu'un peut voir pourquoi cela ne fonctionne pas sur une version moderne de Ruby ?

#!/usr/bin/ruby 

USAGE = <<ENDUSAGE 
Usage: 
    rejse_dumper [-h] [-v] [-u username] [-p password] [-a address] 
ENDUSAGE 

HELP = <<ENDHELP 
    -h, --help  Show this help. 
    -u, --username The login username. 
    -p, --password Force create over an existing directory, 
    -a, --address The URL [Defaults to 'https://example.com'] 

ENDHELP 

ARGS = { address: 'https://example.com' } # Setting default values 
ARGV.each do |arg| 
    case arg 
    when '-h','--help'  then ARGS[:help] = true 
    when '-u','--username' then next_arg = :username 
    when '-p','--password' then next_arg = :password 
    when '-a','--address' then next_arg = :address 
    else 
     if next_arg 
     ARGS[next_arg] = arg 
     end 
    end 
end 

if ARGS[:help] 
    puts USAGE 
    puts HELP if ARGS[:help] 
    exit 
end 

puts username 
puts password 
puts address 
+3

Vous dites rubis à la sortie de la valeur de 'username' via' puts username', mais 'username' n'est pas défini. – lurker

Répondre

2

Le code met les arguments de ligne de commande dans un hachage dans cette partie:

if next_arg 
    ARGS[next_arg] = arg 
end 

mais doesn pas mettre en place des variables individuelles telles que username, password etc. d'où l'erreur que vous avez Je vois.

de sorte que vous pouvez vous référer aux arguments comme ceci:

ARGS[:username] 

ou les affecter à des variables individuelles:

username = ARGS[:username] 

etc.

1

Non, votre hypothèse est incorrecte.

Pour le faire fonctionner, le changement:

puts username 
puts password 
puts address 

à:

puts ARGS[:username] 
puts ARGS[:password] 
puts ARGS[:address]