【问题标题】:Error: undefined local variable or method 'var' for top-level错误:顶级的未定义局部变量或方法“var”
【发布时间】:2020-02-24 18:06:14
【问题描述】:

我是水晶编程语言的新手。

每当我运行这段代码时:

var = ARGV.find { |x| x.split(".").size == 4 } || "0.0.0.0"

ARGV.delete(var)
Addr = var.split(".").map { |x| x.to_i { 0 } }.join(".")
p Addr

使用水晶,我得到一个错误:

Showing last frame. Use --error-trace for full trace.

In q.cr:4:8

 4 | Addr = var.split(".").map { |x| x.to_i { 0 } }.join(".")
            ^--
Error: undefined local variable or method 'var' for top-level

但每当我省略最后一行p Addr,或将var 替换为Var 时,代码似乎都可以正常工作。

水晶版:

Crystal 0.31.1 (2019-10-21)

LLVM: 9.0.0
Default target: x86_64-pc-linux-gnu

我的代码有什么问题?

【问题讨论】:

    标签: crystal-lang


    【解决方案1】:

    这是一个小问题,我们希望将来能得到更好的错误消息。

    所以这个难题的第一部分是理解var 是一个局部变量,因为它以小写字母开头,而Addr 是一个常量,因为它以大写字母开头。

    由于常量初始值设定项的原因,常量赋值中= 符号之后的代码在第一次访问常量时会延迟运行。因此,它们存在于自己的作用域中,不能引用顶级作用域中定义的局部变量。

    因此,对于您的示例,有三种方法可以解决此问题。首先通过调用addrAddr 也设为局部变量。第二次通过调用Varvar 提升为常量。或者第三次将整个代码放入常量初始化器中:

    Addr = begin
      ip = ARGV.find { |arg| arg.count('.') == 3 } || "0.0.0.0"
      ARGV.delete(ip)
      ip.split('.').map { |part| part.to_i { 0 } }.join('.')
    end
    

    这三个中哪一个最好很大程度上取决于您的程序的品味和结构。

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      相关资源
      最近更新 更多