我正在努力学习 Julia。为什么下面的简单代码没有运行:
chnum = 3
while chnum < 100
println(chnum)
chnum = chnum + 2
end
错误是:
RROR: LoadError: UndefVarError: chnum not defined <<<<< NOTE THIS.
Stacktrace:
[1] top-level scope at /home/iuser/testing.jl:4 [inlined]
[2] top-level scope at ./none:0
[3] include at ./boot.jl:317 [inlined]
[4] include_relative(::Module, ::String) at ./loading.jl:1044
[5] include(::Module, ::String) at ./sysimg.jl:29
[6] exec_options(::Base.JLOptions) at ./client.jl:266
[7] _start() at ./client.jl:425
in expression starting at /home/iuser/testing.jl:3
为什么此处无法识别 chnum
变量?
答案 0 :(得分:1)
这是因为作用域在 Julia 中是如何工作的。该文档在 Scope of Variables 上有一个非常好的页面,特别相关的是 On Soft Scope 部分,它解释了为什么规则是这样的背后的基本原理,并且还提供了一些历史(行为已经改变随着时间的推移,在 Julia 1.5 中,您的代码可以在 REPL 或笔记本中运行)。
在这种情况下,声明:
chnum = 3
声明一个名为 chnum
的全局变量。当 while
循环开始时,会创建一个新的局部(软)作用域,因为没有名为 chnum
的局部变量未定义。
可以通过声明 chnum
global
来防止错误:
chnum = 3
while chnum < 100
global chnum
println(chnum)
chnum = chnum + 2
end
或者将整个事物包装在一个引入局部作用域的结构中:
function print_stuff()
chnum = 3
while chnum < 100
println(chnum)
chnum = chnum + 2
end
end
print_stuff()