为什么未定义的局部变量?

时间:2017-04-14 15:48:37

标签: ruby

根据this回答,我提供了以下代码

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

问题

我认为这在2014年有效,所以任何人都可以看到为什么这不适用于现代版本的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

2 个答案:

答案 0 :(得分:2)

代码将命令行参数放入此部分的哈希值中:

if next_arg
  ARGS[next_arg] = arg
end

但未设置个别变量,例如usernamepassword等,因此您会看到错误。

所以你可以参考这样的论点:

ARGS[:username]

或将它们分配给各个变量:

username = ARGS[:username]

答案 1 :(得分:1)

不,你的假设不正确。

要使其正常工作,请更改:

puts username
puts password
puts address

为:

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