错误:未定义的局部变量或顶级方法'var'



我是crystal编程语言的新手。

每当我运行此代码时:

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版本:

Crystal 0.31.1 (2019-10-21)
LLVM: 9.0.0
Default target: x86_64-pc-linux-gnu

我的代码有什么问题?

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

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

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

对于你的例子,有三种方法可以解决这个问题。首先通过调用addr使Addr也成为局部变量。第二,将var提升为常数,称其为Var。或者第三,将整个代码放入常量初始值设定项:

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

三者中哪一个最好,很大程度上取决于你的品味和节目结构。

相关内容

  • 没有找到相关文章

最新更新