定义了一个Ruby NameError,未定义的局部变量

米哈里斯·菲特诺斯(Mihalis Fthenos)

我制作了一个简单的哈希获取应用程序,该应用程序根据用户输入的第一个字符来检索邮政编码区域。但我不断收到这个错误

postal_codes中lookup_code': undefined local variable or method的main:Object(NameError)中的postal_code_lookup.rb:27:在您的意思是?邮政编码

我很困惑,因为我已经声明了变量,并且在循环中应该可以使用它。

postal_codes = {
  V: "British Columbia",
  Y: "Yukon Territory",
  X: "Northwest Territory",
  T: "Alberta",
  S: "Saskatechewan",
  R: "Manitoba",
  P: "Northern Ontario",
  M: "Toronto",
  L: "Central Ontario",
  K: "Eastern Ontario",
  J: "Western & Northern Quebec",
  N: "Western Ontario",
  G: "Eastern Quebec",
  H: "Metroplitan Montreal",
  A: "Newfoundland & Labradour",
  C: "Prince Edward Island",
  E: "New Brunswick",
  B: "Nova Scotia"
}


def lookup_code(postal_code)
  territory = postal_codes.fetch(postal_code[0].upcase.to_sym)
  puts "Your address is in #{territory}"
end

loop do 
  puts "Do you want to lookup a postal code?(Y/n)"
  prompt = gets.chomp.downcase
  if prompt != "y"
    break
  end

print "Enter your postal code > "
postal_code = gets.chomp

lookup_code(postal_code)

end

我对这里的范围不了解什么?

阿列克谢·马蒂什金(Alexei Matiushkin)

方法引入了新的范围。它们不是闭包:不应期望父作用域的局部变量可以在嵌套作用域中访问。

解决方案1:使用常量

POSTAL_CODES = {
  V: "British Columbia",
  # SKIPPED
  B: "Nova Scotia"
}


def lookup_code(postal_code)
  territory = POSTAL_CODES.fetch(postal_code[0].upcase.to_sym)
  puts "Your address is in #{territory}"
end

解决方案2:使用实例变量

尽管您没有课程,但这里有main,它是的一个特殊实例Object,始终定义为:

@postal_codes = {
  V: "British Columbia",
  # SKIPPED
  B: "Nova Scotia"
}


def lookup_code(postal_code)
  territory = @postal_codes.fetch(postal_code[0].upcase.to_sym)
  puts "Your address is in #{territory}"
end

解决方案3:使用全局变量

$postal_codes = {
  V: "British Columbia",
  # SKIPPED
  B: "Nova Scotia"
}


def lookup_code(postal_code)
  territory = $postal_codes.fetch(postal_code[0].upcase.to_sym)
  puts "Your address is in #{territory}"
end

解决方案4:滥用OOP

一个人可能会在这里创建一个类并使用它的实例:

class Lookup
  def postal_codes
    @postal_codes ||= {
      V: "British Columbia",
      # SKIPPED
      B: "Nova Scotia"
    }
  end

  def lookup_code(postal_code)
    territory = postal_codes.fetch(postal_code[0].upcase.to_sym)
    puts "Your address is in #{territory}"
  end
end

Lookup.new.lookup_code("01234")

解决方案5(归功于@ndn):内联哈希

def lookup_code(postal_code)
  territory = {
    V: "British Columbia",
    # SKIPPED
    B: "Nova Scotia"
  }.fetch(postal_code[0].upcase.to_sym)
  puts "Your address is in #{territory}"
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

NameError未定义的局部变量或方法“ drink”

人偶-未定义的局部变量

未定义的局部变量或方法

NameError:未定义-在Ruby 2.1.2中是否更改了局部变量的解析规则?

Rails视图中的binding.pry:NameError:未定义的局部变量或方法

NameError:未定义的局部变量或扫描方法上的方法

NameError:main:Object的未定义局部变量或方法“ request”

main:Object(NameError)的未定义局部变量或方法'res'

Ruler :: Application:Class的机架未定义局部变量或方法`env'(NameError)

NameError:的未定义局部变量或方法“ app”-Rails 5.1.6升级

main:Object(NameError)的未定义局部变量或方法`config'

main:Object(NameError)的未定义局部变量或方法“类别”

error_message 部分获取 NameError: 未定义的局部变量或方法“对象”

main:Object (NameError) 的未定义局部变量或方法“api”

Ruby 需要导致未定义的局部变量

基于Ruby中语法的未定义局部变量

Ruby on Rails中的局部变量未定义

Ruby on Rails呈现部分未定义的局部变量

Ruby编程错误(未定义的局部变量)

Ruby on Rails的未定义局部变量或方法`profile'

Ruby on Rails错误:未定义的局部变量或方法

Ruby查找需要上传哪些文件或目录:main:Object(NameError)的未定义局部变量或方法“ dir”

局部变量未定义的外部方法

未定义的局部变量或方法“sub_task”

Contact:Class的未定义局部变量或方法“ email”

未定义的局部变量或方法“ arr”

未定义的局部变量或模块的方法

未定义的局部变量或方法“ recipient_email”

Rails形式的未定义局部变量